在用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) 感觉应该好好看看连在串口上的那个设备的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;
就正确了 应该是串口设置不正确导致的。。。 但是还是不明白为什么会出现拔了硬件再插上就正确了。。。
|