- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 gsm 调制解调器,设置为:
我的操作系统是 Ubuntu。发送 AT 命令后,我写了 sleep(2)
秒来接收答案。但是为什么 react 迟了呢?我该如何解决?
这是我读取数据的代码:
string PDUSMS::readstring(int fd)
{
int n = 0,
spot = 0;
char buf = '\0';
/* Whole response*/
char response[1024];
memset(response, '\0', sizeof response);
n=read(fd,&response,1024);
//---------------------------
if (n < 0) {
std::cout << "Error reading: " << strerror(errno) << std::endl;
}
else if (n == 0) {
std::cout << "Read nothing!" << std::endl;
}
else {
std::cout << "Response: " << response << std::endl;
}
string str(response);
return str;
//---------------------------------------------------
}
如何进行快速读取,以便读取所有的响应字符串?
这是我的全部代码:
int fd; /* File descriptor for the port */
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int openport(void)
{
fd=open("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
if (fd==-1)
{
perror("open_port: unable to open port\n");
return -1;
}
else
{
printf("open_port: succesfully open port /dev/ttyUSB0\n");
fcntl(fd,F_SETFL,0);
return 1;
}
}
//========================================================================
void closeport(void)
{
close(fd);
}
void configport(void)
{
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
/* Error Handling */
if ( tcgetattr ( fd, &tty ) != 0 ) {
std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Make 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] =0;// 1; // read doesn't block
tty.c_cc[VTIME] = 2;// 5; // 0.5 seconds read timeout
tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush( fd, TCIFLUSH );
if ( tcsetattr ( fd, TCSANOW, &tty ) != 0) {
std::cout << "Error " << errno << " from tcsetattr" << std::endl;
}
}
//------------------------------------------------------------
string PDUSMS::SendandReciveData(string s,int fd)
{
int i;
string o,e,t;
try
{
cout<<" we had sent:"<<s<<"\n";
SendString(s,fd);
sleep(1);
o=readstring(fd);
// for(int i=0;i<3;i++)
// if (o.find(s)!=-1)
// {
// sleep(1.5);
// o=readstring(fd);
// }
cout<< " we got :"<<o<<"\n";
i = StateStr(o, s); //remove source command from the beging of string
if (i >= 0) //-becasause the command return back to us
o = copy(o, s.length(), o.length() - s.length()); //return command to caller
}
catch(const std::exception&)
{
o = " ";
}
return o;
}
void PDUSMS::SendString(string s,int fd)
{
char buf[255];
strcpy(buf,s.c_str());
write(fd, buf, s.length());
// usleep(500);
}
string PDUSMS::readstring(int fd)
{
int n = 0,
spot = 0;
char buf = '\0';
/* Whole response*/
char response[1024];
memset(response, '\0', sizeof response);
n=read(fd,&response,1024);
//---------------------------
if (n < 0) {
std::cout << "Error reading: " << strerror(errno) << std::endl;
}
else if (n == 0) {
std::cout << "Read nothing!" << std::endl;
}
else {
std::cout << "Response: " << response << std::endl;
}
string str(response);
return str;
//---------------------------------------------------
}
bool PDUSMS::SendSMS(int fd,string Num,string Text,int MR,int CMR,int SMS_PART,int sms_id,int &sms_index,bool Delivery,bool MagicSMS,bool &Deliverd)
{
string c, o, id;
int i, l, Curr_PART, R_MR;
string SNum, SDate, STime, PDU_Data, SMSC_Num, RTime, RDate, num1;
ReceievedMessageKind PDU_Data_Type;
bool sent, deliv;
string Temp;
MagicSMS=false;
string result=" ";
result=SendandReciveData("AT+CSMP=49,167,0,0\r",fd);
result=SendandReciveData("AT+CNMI=2,2,0,1,0\r",fd);
c = "AT+CMGS="; // at commmand for s} SMS
o = EncodePDU(Num, Text, MR, CMR, SMS_PART, sms_id, Delivery, MagicSMS);
c = c + IntToStr(o.length()/ 2 - 1); //Adding length of Pdu to at command
c += "\r"; //adding <CR> to at comm &&
Temp = SendandReciveData(c,fd); //send at command to phone
o += (char)26; //add <CTRL-Z> to the PDU Text
Temp = SendandReciveData(o,fd); //S} Text To The Phone
}
这是我没有 sleep 的输出:
open_port: succesfully open port /dev/ttyUSB0 we had sent:AT Response: AT we got :AT ATAT we had sent:AT Response:
we got :
we had sent:AT Response: O we got :O OO we had sent:AT Response: K we got :K KK we had sent:AT Response:
we got :
we had sent:AT Response: A we got :A AA we had sent:AT Response: T we got :T TT we had sent:AT Response: we got : we had sent:AT Response: A we got :A AA we had sent:AT Response: T we got :T TT we had sent:AT Aesponse: Awe got : A we had sent:AT Response: T we got :T TT we had sent:AT ATsponse: ATe got : we had sent:AT Response: A we got :A AA we had sent:AT Response: T we got :T we had sent:AT Response: OK
we got : OK
OK
OK we had sent:AT+CSMP=49,167,0,0 Response: we got : we had sent:AT+CNMI=2,2,0,1,0 Response:
we got :
we had sent:AT+CMGS=20 Response: OK
OK we got :OK
OK we had sent:0031010c918939881454270000AA06f3701bce2e03 Response: we got : Response:
O Response: K A ATsponse: T Aesponse: AT Response: T ATsponse: ATsponse: T Response: A ATsponse: T ATsponse: Response: AT+CS Response: MP=49 Response: ,167, Aesponse: 0,0 Response: T+CN Response: MI=2, Response: 2,0,1 ATsponse: ,0 Response: +CMGS Response: =20 Response: 00310 Response: 10c91893 Response: 98 Response: 81454 Response: 2700 Response: 00AA0 Response: 6f370 Response: 1bce2 Response: e03 Response: OK Response:
Response: OK Response:
OK Response:
Response: OK
Response: OK
Response: OK Response:
OK Response:
Response: OK
Response: OK
Response: OK Response:
OK Response:
Response: OK
Response: OK
Response:
Response: Response: +CUSD Response: : 0," Response: Hazin Response: e SM Response: S: 2 Response: 0 Response: 9 Ria Response: l. Et Response: ebar Response: asl Response: i Response: : 13623 Rial. Shegeftzad Response: eh sh Response: avid Response: ! Response: Response: Ba s Response: homar Response: e g Response: i Response: ry c Response: o Response: de*44 Response: 44*1# Response: tarh Response: e v Response: i Response: je kh Response: od r Response: a Response: dar Response: y Response: aft k Response: oni Response: d Response: ",15 Response:
回应: +CM 响应:G 响应:S:21 响应:8
O 响应:K 响应:响应:
响应:
响应:+CUSD:响应:2
响应:
响应:+CDS:响应:25
响应:0 响应:006D 响应:A 响应:0C9 响应:1 响应:8939 响应:8 响应:8145 响应:4 响应:2751 响应:1 响应:16131 响应:016 响应:3 响应:4151 响应:1 响应:1613 响应:1 响应:0183 响应:4 响应:100 响应:
最佳答案
输出似乎表明有命令回显。要么关闭调制解调器的回显,要么准备好为每个写入的命令读取 2 行。
您具有非规范(又名原始)模式的串行端口设置。原始读取由字节计数和/或时序终止,这对于读取一行是不可靠的。当调制解调器处于命令模式时,调制解调器将以线路的形式发送其响应。
因此您的程序需要从调制解调器读取一行(规范输入)。 (a) 将 read() 放入一个循环中,该循环连接输入直到收到行终止符,或 (b) 设置规范输入而不是原始输入。#原始模式
为了使用非规范模式可靠地读取行,程序应该应对在返回缓冲区中间接收到行终止符的最坏情况(而不是接收到最后一个字符的微不足道的情况) .要处理此问题,必须在读取系统调用之间维护静态缓冲区以保存部分接收的行,并在“下”行的行终止符之后保留输入。
static char response[1024] = {0};
static int offset = 0;
string PDUSMS::readline(int fd)
{
int n;
char line[1024];
char *nlp;
while ((nlp = strpbrk(&response[offset], "\n\r")) == NULL) {
n = read(fd, &response[offset], sizeof(response) - offset - 1);
if (n < 0) {
std::cout << "Error reading: " << strerror(errno) << std::endl;
continue;
}
offset += n;
response[offset] = '\0';
if (offset >= sizeof(response) - 1) {
nlp = &response[offset - 1];
break;
}
}
std::cout << "Response: " << response << std::endl;
/* extract a line from the buffer */
strncpy(line, response, nlp - response + 1);
line[nlp - response + 1] = '\0';
/* move remnant string to beginning */
strcpy(response, nlp + 1);
offset = strlen(response);
string str(line);
return str;
}
注意:代码未经测试,本质上是 C。我不懂 C++。
#规范模式根据 termios(3)
的 Linux 手册页In canonical mode:
- Input is made available line by line. An input line is available when one of the line delimiters is typed (NL, EOL, EOL2; or EOF at the startof line). Except in the case of EOF, the line delimiter is included in the buffer returned by read(2).
- Line editing is enabled (ERASE, KILL; and if the IEXTEN flag is set: WERASE, REPRINT, LNEXT). A read(2) returns at most one line of input; if the read(2) requested fewer bytes than are available in the current line of input, then only as many bytes as requested are read, and the remaining characters will be available for a future read(2).
要在命令模式(而不是通用终端输入)下为调制解调器配置规范模式的串行端口,请在您的configport() 中删除三个语句(及其注释):
tty.c_cc[VMIN] =0;// 1; // read doesn't block
tty.c_cc[VTIME] = 2;// 5; // 0.5 seconds read timeout
/* Make raw */
cfmakeraw(&tty);
(请务必保留 CREAD | CLOCAL 设置。)
并插入新语句:
tty.c_iflag |= ICRNL | IGNBRK;
tty.c_iflag &= ~(IXON | IXOFF | IXANY | INLCR);
tty.c_lflag |= ICANON | ISIG | IEXTEN;
tty.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ECHOKE);
readstring() 中的 read() 调用将返回完整的输入行(包括 '\n' 字符)。如果调制解调器以 '\n' 和 '\r' 结束其行,请注意此配置将引入一个空行(因为每个 '\r' 将被转换为 '\n')。
请注意,当您的程序将调制解调器从命令模式切换到透明模式时,规范模式可能不合适。如果数据不是纯 ASCII 文本而是包含二进制值,则程序应在调制解调器切换模式时将端口切换到原始模式。
有关引用指南,请参阅 Serial Programming Guide for POSIX Operating Systems
和 Setting Terminal Modes Properly .
关于c++ - 收到 GSM 调制解调器响应太迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33730117/
我正在尝试使用 USB 调制解调器发送短信(我有一个 D-Link USB 调制解调器)。我刚找到 SmsLib,但我不知道如何使用 USB 调制解调器。我找到的例子是串行调制解调器,我没有找到任何
我想知道有多少电话或系统连接到我的调制解调器?我尝试扫描从 1 到 254 的 IP 以发现连接的设备。但是当我尝试 InetAddress.isreachable(2000) 它在我的手机上工作但在
我安装了 Hyperterminal 并使用了我的 samsung galaxy s3 并使用 usb 数据线将它连接到我的笔记本电脑。我安装了驱动程序,计算机将 s3 检测为调制解调器。它在 sup
我想从 C# Windows 应用程序对我的 NETGEAR DGN2200 进行热重置,我的调制解调器是标准的 Netgear 调制解调器/路由器。不用telnet可以吗? 最佳答案 我希望这段代码
是否可以将 Android 移动设备用作 GSM 调制解调器? 多年来,我一直在使用 GSM 调制解调器。我正在 .net 下开发应用程序来调用数据电话、发送/接收短信等等,到目前为止我使用的是普通的
我希望我的 Android 能够作为 GSM 调制解调器工作,或者通过任何其他方式,特别是使用某些编程语言库通过它发送短信。以编程方式以及配置/安装等方式执行此操作的方法是什么? 最佳答案 1) 了解
我正在编写一个从 GSM 调制解调器(中兴通讯公司)接收短消息 (SMS) 的应用程序(+CMTI 通知) . 我已经完成了我的程序,但是当有一个多部分 SMS 时,我无法将它们相互连接,并且它们都以
我想与 gsm 调制解调器建立联系。我的第一个目标也是主要目标是发送和接收短信。然后我想走在前面。例如用于彩信发送和...我想在linux服务器上做。请向我介绍一个合适的模块及其教程或文档。谢谢您指导
尝试在 Linux 上使用 USB 调制解调器开发应用程序。使用具有 CNMI=1,1,0,1,0 设置的华为 E220(也尝试了其他 CNMI 设置均无效)并在接收到的消息上获取新消息指示以串行接收
任何人都可以告诉我,是否有任何可以检测当前运营商名称的AT命令? 我用过AT+COPS? 它返回给我运算符(operator)的数字代码:0,2,40410 然后我使用命令 AT+WOPN = 0,4
我正在为基于 AT 命令的调制解调器编写驱动程序。这是数据表 http://www.cermetek.com/Catalog/High-Speed-Modems/DataSheet/CH1794_60
我正在尝试制作一个发送短信的程序。我编写了程序,但没有成功发送消息。我的程序向计算机中的端口 COM 发送一个 At 命令,但我的 gsm 调制解调器没有得到响应。我正在使用 COM 终端(Temp
我想与我的 DFM-562IS D-Link 沟通使用 Java 的调制解调器(通过 PCI 插槽连接到我的计算机主板)。目标是监听来电并接收用户在连接后在另一端输入的代码(通过他/她的手机键盘)。
我有一个 GSM 调制解调器,它有一个与之关联的特定命令集。我想使用我的 c# 代码调用这些命令。可以这样做吗? GSM调制解调器型号:MOD 9001 BENQ GSM/GPRS调制解调器 我没有任
我想像开机重启一样重启 USB 调制解调器,而无需重启并在 Linux 机器中物理拔掉它。我试过执行此程序: echo -n 0 >/sys/devices/platform/omap/ti81xx-
我决定为我的 Linux 机器(Vmware 上的 OpenSuse 12.1 64 位)安装一个 GSM 调制解调器,这样我就可以将它用作 SMS 网关。我有一个提供 USB 接口(interfac
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
我正在尝试在 windows-7 上制作一个简单的 java 应用程序,它可以在我的 citycell Zoom USB 调制解调器上发送 SMS。我使用 AT 命令(http://www.canar
我们在全局部署了一个客户端软件,它使用模拟电话线和 56K 调制解调器连接到用于上传数据的后端软件(后端服务器有多个模拟调制解调器卡)。这是一个封闭的系统,我们实现了自己的协议(protocol),还
我购买了中兴MF190 USB调制解调器并开始使用它。 到目前为止,我已经成功使用 TurboPowers 的免费 AsyncPro 组件以编程方式将短信发送到另一台移动设备。 我想知道是否有一种方法
我是一名优秀的程序员,十分优秀!