我正在使用Linux从Phidget sbc上的串行端口读取二进制数据,以从PC上运行的应用程序获取命令。 我在VB写了一个testing程序来读取数据到一个字节数组,并将其转换为十进制使用它,但无法弄清楚如何在C中做到这一点。 我无法拿出我在互联网上做过的研究。
从PC发送的命令是0x0F。
为了检查我是否得到正确的数据,我读取数据并将其发回。 这是我回来的。 返回的数据有一个回车添加到它。
hex显示0F00 0000 0D
'\'Display \ 0F \ 00 \ 00 \ 00 \ r
正常显示只是显示一个奇怪的字符。
这告诉我,数据是在那里,我可以使用,但不知道提取值0F或15。
我如何转换传入的数据来使用它?
我尝试使用strtol转换收到的数据,但它返回0.我也尝试将端口设置为raw,但没有任何区别。
unsigned char buffer1[1]; int ReadPort1() { int result; result = read(file1, &buffer1,1); if(result > 0) { WritePort1(buffer1); sprintf(tempstr, "Port1 data %s %d", buffer1, result); DisplayText(2,tempstr); } return result; }
端口打开/设置
void OpenPort1() { //file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NONBLOCK); file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NODELAY); if(file1 < 0) printf("Error opening serial port1.\n"); else { SetPort(file1, 115200, 8, 1, 0, 1); port1open = 1; } } void SetPort(int fd, int Baud_Rate, int Data_Bits, int Stop_Bits, int Parity, int raw) { long BAUD; // derived baud rate from command line long DATABITS; long STOPBITS; long PARITYON; long PARITY; struct termios newtio; switch (Baud_Rate) { case 115200: BAUD = B115200; break; case 38400: BAUD = B38400; break; case 19200: BAUD = B19200; break; case 9600: BAUD = B9600; break; } //end of switch baud_rate switch (Data_Bits) { case 8: default: DATABITS = CS8; break; case 7: DATABITS = CS7; break; case 6: DATABITS = CS6; break; case 5: DATABITS = CS5; break; } //end of switch data_bits switch (Stop_Bits) { case 1: default: STOPBITS = 0; break; case 2: STOPBITS = CSTOPB; break; } //end of switch stop bits switch (Parity) { case 0: default: //none PARITYON = 0; PARITY = 0; break; case 1: //odd PARITYON = PARENB; PARITY = PARODD; break; case 2: //even PARITYON = PARENB; PARITY = 0; break; } //end of switch parity newtio.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; if(raw == 1) { newtio.c_oflag &= ~OPOST; newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); } else { newtio.c_lflag = 0; //ICANON; newtio.c_oflag = 0; } newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); }
你在寻找你的数据的十六进制表示?
sprintf(tempstr, "Port1 data %s %x", buffer1, buffer1[0]);