我试图使用此代码从USB适配器(PL2303)读取数据。
我的USB芯片的规格是57600,无奇偶校验,1个停止位,8位数据模式
我可以从buf []获取一些wave数据,但是我不知道这些数字是什么意思。
3,-1225386821,0,0,1934713408,6,400,520192,45826,0,15971,0,2,2,-1091179996,3,-1226244648,-1225242284,-1227820936,524408,2,45826,0,0 ,15971、33188
这是Hexa还是什么?
如何从中获取有意义的数据?我的C ++代码有什么问题吗?
int open_port(void)
{
int fd;
fd=open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
if(fd==-1)
{
fprintf(stderr, "open_port: Unable to open - %s\n", strerror(errno));
}
return (fd);
}
此代码在Linux中使用。
int main()
{
int mainfd=0,fd;
//char chout;
int buf[5000];
struct termios options;
FILE *pFile;
pFile = fopen("rawdata.txt","w+");
mainfd=open_port();
fcntl(mainfd, F_SETFL, FNDELAY);
tcgetattr(mainfd, &options);
cfsetispeed(&options, B57600);
cfsetospeed(&options, B57600);
options.c_cflag |= (CLOCAL/CREAD);
options.c_cflag &= PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag &= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_cflag &= ~(ICANON | ECHO | ISIG);
read(mainfd, buf, 5000);
for(int i=0;i<5000;i++)
{
cout<<buf[i]<<endl;
fprintf(pFile,"%d\n",buf[i]);
}
return 0;
}
最佳答案
这是Hexa还是什么?
如果是十六进制,则不会。
如何从中获取有意义的数据?
首先,您必须编写程序以匹配接收到的数据(例如,字节与字,文本与二进制),然后程序需要跟踪什么是实际接收的数据与未初始化的内存。
我的C ++代码有什么问题吗?
是的,您的代码有几个重大问题。
1.您的程序使用非阻塞模式。
fd=open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
...
fcntl(mainfd, F_SETFL, FNDELAY);
open()使用O_NDELAY选项,然后程序冗余地确保通过fcntl()调用激活非阻塞模式。
非阻塞模式可以是执行I / O的有效方法,但是您的程序显然不能实现处理其他复杂性的技术。
在阻塞模式下访问串行终端会更好。
只需将fcntl()调用重新编码为:
fcntl(mainfd, F_SETFL, 0);
2. termios初始化有错误,并且不完整。
以下两个语句是模糊的termios操作:
options.c_cflag &= PARENB;
options.c_cflag &= CS8;
这两个语句仅保留这些属性的现有状态。但是您不知道现有状态是什么,更糟糕的是,您不知道结果状态是否将是您所需的属性状态。
以下语句是错误的,因为这些termios属性在c_cflag结构成员中不存在:
options.c_cflag &= ~(ICANON | ECHO | ISIG);
尝试非规范模式的termios初始化不完整。该程序使其他几个属性保持不变(例如VMIN和VTIME),因此读取行为可能是不可预测的。
3.不会应用termios设置。
您的程序缺少对tcsetattr()的调用,因此实际上未应用新的termios设置。
4.从不读取read()系统调用的返回代码。
来自以下syscall的返回代码将被忽略:
read(mainfd, buf, 5000);
因此,您的程序无法检测是否发生任何错误。
如果读取成功,则您的程序将不知道返回了多少数据(如果有)。
5.程序正在访问未初始化的内存。
您的程序无条件处理整数数组的5000个元素的整个数组。
但是,根据read()syscall的语义,已指定最大5000字节(而不是数组元素或整数),并且syscall可能(并且很可能会)返回比该最大值更少的数据。
程序不应盲目地处理整个数组,而应仅访问缓冲区中实际存储的字节数(如正的read()返回代码所示)。
是否应该将接收到的数据视为有符号整数而不是无符号字节。由于不能保证read()也不可能返回整数的
sizeof(int)
字节,因此盲目地将接收到的数据处理为整数可能是不正确的。您忽略了该数据所代表的含义,而没有提及“ wave”。
关于c++ - 读取USB串行数据时遇到问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55791624/