请教一个关于linux usb转串口的问题

时间:2023-02-08 15:59:45
菜鸟一名,小弟遇见了一个很奇怪的问题
我在用linux的串口操作外围的usb转串口的一个温湿度计
代码中将串口设置好了之后无论怎么读都不能读取出数据来
但是将外部设备拔下来然后再连接上
代码里不再设置串口的相关属性直接打开,就可以读取数据了,但是再进行与上一次串口同样的设置的话,又不能读取了。不知道是怎么回事儿。现在的问题是每次要操作设备,还得拔下来一次来再插上去,还要修改代码。请各位帮帮忙。。。
附上代码:

#include <iostream>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
using namespace std;
int m_handle = 0;
unsigned char startcmd01[4] = { 0x01, 0x80, 0x33, 0xfe };
void set_com(int fd) {
struct termios tm;
tcgetattr(fd, &tm);
cfmakeraw(&tm);
tcflush(fd, TCIOFLUSH);


tcsetattr(fd, TCSANOW, &tm);
tcflush(fd, TCIOFLUSH);
if (tcgetattr(fd, &tm) != 0) {
cout << "获取tm2失败" << endl;
return;
}
tm.c_cflag = B4800 | CRTSCTS | CS8 | CLOCAL | CREAD;
tm.c_iflag &= ~IGNPAR;
tm.c_cc[VTIME] = 150;
tm.c_cc[VMIN] = 6;
if (tcsetattr(fd, TCSANOW, &tm) != 0) {
cout << "设置tm2失败" << endl;
return;
}
tcflush(fd, TCIFLUSH);
}
int main() {
printf("---\n");
m_handle = open("/dev/ttyUSB0", O_RDWR);
if (m_handle == -1) {
return -1;
}
//printf("---\n");
//set_com(m_handle);


int count = write(m_handle, startcmd01, 4);
if (!count) {
cout << "write failed!" << endl;
return 0;
}
cout << "count:" << count << endl;
unsigned char readbuf[6] = { 0 };
printf("---\n");

read(m_handle, readbuf, 6);
printf("%d\n", readbuf[0]);
close(m_handle);
return 0;
}



系统ubuntu12.04     外部温度计temperhum232(usb转串口芯片ch341)

2 个解决方案

#1


感觉应该好好看看连在串口上的那个设备的datasheet
很可能是你的操作顺序没有遵循设备的要求;

#2


引用 1 楼 linlan999 的回复:
感觉应该好好看看连在串口上的那个设备的datasheet
很可能是你的操作顺序没有遵循设备的要求;

额。。。我已经解决了。。。   但是我也不知道原因是怎额回事儿   我在程序设置串口的时候加了


tm.c_cflag &= ~HUPCL;
tm.c_iflag &= ~INPCK;
tm.c_iflag |= IGNBRK;
tm.c_iflag &= ~ICRNL;
tm.c_iflag &= ~IXON;
tm.c_lflag &= ~IEXTEN;
tm.c_lflag &= ~ECHOK;
tm.c_lflag &= ~ECHOCTL;
tm.c_lflag &= ~ECHOKE;
tm.c_oflag &= ~ONLCR;

就正确了  应该是串口设置不正确导致的。。。  但是还是不明白为什么会出现拔了硬件再插上就正确了。。。

#1


感觉应该好好看看连在串口上的那个设备的datasheet
很可能是你的操作顺序没有遵循设备的要求;

#2


引用 1 楼 linlan999 的回复:
感觉应该好好看看连在串口上的那个设备的datasheet
很可能是你的操作顺序没有遵循设备的要求;

额。。。我已经解决了。。。   但是我也不知道原因是怎额回事儿   我在程序设置串口的时候加了


tm.c_cflag &= ~HUPCL;
tm.c_iflag &= ~INPCK;
tm.c_iflag |= IGNBRK;
tm.c_iflag &= ~ICRNL;
tm.c_iflag &= ~IXON;
tm.c_lflag &= ~IEXTEN;
tm.c_lflag &= ~ECHOK;
tm.c_lflag &= ~ECHOCTL;
tm.c_lflag &= ~ECHOKE;
tm.c_oflag &= ~ONLCR;

就正确了  应该是串口设置不正确导致的。。。  但是还是不明白为什么会出现拔了硬件再插上就正确了。。。