读取 USB 串行数据时出现问题
Have a problem with reading USB serial data
我尝试使用此代码从USB适配器(PL2303)读取数据。
我的 USB 芯片的规格是 57600,无奇偶校验,1 个停止位,8 位数据模式
我可以从 buf[] 获得一些波数据,但我不知道这些数字意味着什么。
3, -1225386821, 0, 0, 1934713408, 6, 400, 520192, 45826, 0, 15971, 0, 2, -1091179996, 3, -1226244648, -1225242284, -1227820936, 524408, 2, 45826, 0, 0, 15971, 33188
这是六人组还是什么?
如何从中获取有意义的数据?我的 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 - %sn", 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,"%dn",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.术语初始化有错误,不完整。
以下两个语句是模棱两可的术语操作:
options.c_cflag &= PARENB;
options.c_cflag &= CS8;
这两个语句都只是保留这些属性的现有状态。 但是您不知道现有状态是什么,更糟糕的是,您不知道生成的状态是否是您需要的属性状态。
以下语句是错误的,因为这些 termios 属性在c_cflag结构成员中不存在:
options.c_cflag &= ~(ICANON | ECHO | ISIG);
尝试非规范模式的术语初始化不完整。 该程序保留了其他几个属性(例如VMIN和VTIME),因此读取行为可能是不可预测的。
3. 术语设置永远不会应用。
您的程序缺少对tcsetattr()的调用,因此实际应用了新的术语设置。
4. 从不计算来自read()系统调用的返回代码。
来自以下系统调用的返回代码将被忽略:
read(mainfd, buf, 5000);
因此,程序无法检测是否发生了任何错误。
如果读取成功,则程序不知道返回了多少数据(如果有)。
5. 程序正在访问未初始化的内存。
程序无条件地处理整数数组的 5000 个元素的整个数组。
但是,根据read() 系统调用的语义,指定了最大 5000 字节(而不是数组元素或整数),并且系统调用可能(并且很可能会)返回比最大值更少的数据。
程序不应该盲目地处理整个数组,而应该只访问实际存储在缓冲区中的字节数(如正read()返回代码所示)。
接收到的数据是否应被视为有符号整数而不是无符号字节是值得怀疑的。 由于read()不能保证也不太可能返回整数的sizeof(int)
字节,因此盲目地将接收到的数据作为整数处理可能是不正确的。 除了提到">波浪"之外,您忽略了描述这些数据代表什么。
正如 @πάτα ῥεῖ 评论的那样,问题是缓冲区被声明为int
。
请将int buf [5000];
中的int
更改为unsigned char
或uint8_t
。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- HDF5Cpp 扩展复合数据集超板问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 我对数据结构、双向链表有一些问题
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- Java 客户端C++服务器数据发送/接收问题
- printf 数据类型说明符复杂问题
- 从文件导入数据时遇到问题.我有一个没完没了的循环
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用SSE内部函数复制少量数据时出现问题
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 面对迭代矢量<矢量<string>>和打印数据的问题
- C++中从客户端到服务器的数据传输问题
- 将此类数据作为字符串进行比较时出现问题
- 线程清理器检测到数据争用,问题出在哪里?
- 如何解决在 clr 项目的特定文件中写入数据的问题?
- C++奇怪的问题.数据成员超出范围
- C 的多态性问题 - 数据覆盖
- 面试问题——数据结构