| 
              #include <fcntl.h>#include <stdio.h>
 #include <string.h>
 #include <termios.h>
 #include <unistd.h>
 
 #define DSNEG (1 << 4)
 #define DSERR (1 << 6)
 
 char *getcode(unsigned char data)
 {
 const char *list = "0123456789abcdef";
 static char code[5];
 strcpy(code, "0x??");
 code[2] = list[data >> 4];
 code[3] = list[data & 0x0f];
 return code;
 }
 
 int readtemp(int fd, unsigned char *buf, int len)
 {
 int i, j, n;
 int cnt = 0;
 buf[0] = 0;
 for (i = 1; cnt < len; i++)
 {
 n = read(fd, buf + cnt, len - cnt);
 if (n == 0)
 break;
 printf("第%d次读取的数据为: ", i);
 for (j = 0; j < n; j++)
 {
 printf("%s", getcode(buf[cnt + j]));
 if (j + 1 < n)
 putchar(' ');
 else
 putchar('\n');
 }
 cnt += n;
 }
 return cnt;
 }
 
 void decode(unsigned char *buf)
 {
 double temp;
 if (buf[1] & DSERR)
 {
 perror("但温度数据有误!\n");
 return;
 }
 temp = buf[2] * 1.00 + buf[3] * 0.01;
 if (buf[1] & DSNEG)
 temp = -temp;
 printf("温度值为: %.2lf\n", temp);
 }
 
 int main(void)
 {
 unsigned char buf[4] = {0x83};
 int fd, n;
 struct termios t;
 
 fd = open("/dev/ttyUSB0", O_RDWR);
 if (fd == -1)
 {
 perror("打开串口失败!\n");
 return 0;
 }
 
 if (tcgetattr(fd, &t) == 0)
 {
 write(fd, buf, 1);
 n = readtemp(fd, buf, sizeof(buf));
 
 if (n != sizeof(buf))
 printf("传回的数据不完整,只读取了%d字节!\n", n);
 else if (buf[0] == 0x83)
 {
 printf("读取温度值成功!\n");
 decode(buf);
 }
 else
 printf("读取温度值失败, 错误码: %s\n", getcode(buf[0]));
 }
 else
 perror("获取串口默认配置失败!\n");
 
 close(fd);
 return 0;
 }
 
 |