gpt4 book ai didi

c++ - 读取 USB 串行数据时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:51:55 24 4
gpt4 key购买 nike

我尝试使用此代码从 USB 适配器 (PL2303) 读取数据。

我的USB芯片规范是57600,无奇偶校验,1个停止位,8位数据模式

我可以从buf[]中获取一些波形数据,但我不知道这些数字意味着什么。

3, -1225386821, 0, 0, 1934713408, 6, 400, 520192, 45826, 0, 15971, 0, 2, -1091179996, 3, -1226244648, -1225242284, -12278209 36、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;
}

最佳答案

Is this Hexa or something?

如果您指的是十六进制,则不是。

How do I get meaningful data from this?

首先,您必须编写程序来匹配接收到的数据(例如字节与字、文本与二进制),然后您的程序需要跟踪实际接收到的数据与未初始化的内存。

Is there any problem in my c++ code?

是的,您的代码存在几个重大问题。

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;

这两个语句只是保留这些属性的现有状态。但您不知道现有状态是什么,更糟糕的是您不知道结果状态是否是您需要的属性状态。

以下语句是错误的,因为 c_cflag 结构成员中不存在这些 termios 属性:

options.c_cflag &= ~(ICANON | ECHO | ISIG);

尝试非规范模式的 termios 初始化不完整。该程序未修改其他几个属性(例如 VMIN 和 VTIME),因此读取行为可能是不可预测的。

3。 termios 设置永远不会应用。

您的程序缺少对 tcsetattr() 的调用,以便实际应用新的 termios 设置。

4。 read() 系统调用的返回代码永远不会被评估。

以下系统调用的返回代码将被忽略:

   read(mainfd, buf, 5000);  

因此,您的程序无法检测是否发生了任何错误。
如果读取成功,则您的程序不知道返回了多少数据(如果有)。

5。程序正在访问未初始化的内存。

您的程序无条件处理整型数组的 5000 个元素的整个数组。
但是,根据 read() 系统调用的语义,已指定最大 5000 字节(而不是数组元素或整数),并且系统调用可能(并且很可能会)返回比该最大值更少的数据。
程序不应盲目地处理整个数组,而应仅访问实际存储在缓冲区中的字节数(由正的 read() 返回代码表示)。

是否应将接收到的数据视为有符号整数而不是无符号字节是值得怀疑的。由于 read() 不能保证也不可能返回整数个 sizeof(int) 字节,因此盲目地将接收到的数据处理为整数可能是不正确的。除了提及“wave”之外,您忽略了描述该数据代表的内容。

关于c++ - 读取 USB 串行数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791624/

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