gpt4 book ai didi

c - 当数据可用时从串行端口读取

转载 作者:行者123 更新时间:2023-11-30 15:21:14 25 4
gpt4 key购买 nike

我正在尝试编写一个与连接到 GSM 调制解调器的串行端口进行通信的程序。使用AT命令与调制解调器通信。这是我的代码。从 http://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html 获取- 规范输入处理。

当输出返回单行时它工作正常。例如:

AT 返回OK

我的问题是如果我发送 AT+CPIN? 它会返回几行,例如:
+CPIN:SIM PIN
确定

但我的程序只读取 +CPIN: SIM PIN 并中断。如何修复它?

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

#define BAUDRATE B38400
#define dev "/dev/ttyUSB0"
#define _POSIX_SOURCE 1

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main()
{
char pinn[20];
char buf[255];
int fd,res=0;
printf("%s\n", dev);
struct termios oldtio,newtio;
fd = open(dev, O_RDWR | O_NOCTTY );
if (fd <0) {perror(dev); exit(-1); }
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN] = 1;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);


if (fd < 0)
{
printf("Error opening serial port\n");
exit(1);
}
while(1){

scanf("%s",pinn);
strcat(pinn,"\r");

if (write(fd, pinn, strlen(pinn)) < strlen(pinn)) printf("Write error - %s \n", strerror(errno));
pinn[strlen(pinn)-1]=0;
while(1){
res = read(fd,buf,255);
buf[res]=0;
buf[res-1]=0;
if (res>1&&NULL==strstr(buf,pinn)) break;
}
printf("\"%s\"\n", buf);
}
close(fd);
}

代码更新删除了重复读取

最佳答案

除了代码的其他小缺陷之外,如果返回的字符串不包含您最初发送的命令,则接收 while() 循环将终止(NULL==strstr(buff, pinn ))

当您收到多行结果时,显然不满足此条件(因为只有第一行包含您发送的 AT 命令)。

如果您不想要它,则需要更改它。

关于c - 当数据可用时从串行端口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com