uart.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /*
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <termios.h>
  9. #include <errno.h>
  10. #include <string.h>
  11. #include <strings.h>
  12. #include <sys/socket.h>
  13. #include <arpa/inet.h>
  14. #include <sys/ioctl.h>
  15. #include <net/if.h>
  16. #include <time.h>
  17. */
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <unistd.h>
  21. #include <fcntl.h>
  22. #include <termios.h>
  23. #include <string.h>
  24. #include <sys/socket.h>
  25. #include <arpa/inet.h>
  26. #include <net/if.h>
  27. #include <time.h>
  28. #define False -1
  29. #define True 0
  30. #define BuffSize 256
  31. typedef struct {
  32. int year, month, day, hour, minute, second;
  33. } Time;
  34. const int TimeSize = sizeof(Time *);
  35. Time *Now_Time() {
  36. Time *now = (Time *)malloc(TimeSize);
  37. time_t currentTime = time(NULL);
  38. struct tm *localTime = localtime(&currentTime);
  39. now->year = localTime->tm_year + 1900;
  40. now->month = localTime->tm_mon + 1;
  41. now->day = localTime->tm_mday;
  42. now->hour = localTime->tm_hour;
  43. now->minute = localTime->tm_min;
  44. now->second = localTime->tm_sec;
  45. return now;
  46. }
  47. int Str_Split(char *str, char c, char ***res) {
  48. int count = 1, i = 0, len;
  49. char *temp = str, *start, **arr;
  50. while (*temp != 0) {
  51. if (*temp == c) count++;
  52. temp++;
  53. }
  54. arr = (char **)malloc(count * sizeof(char *));
  55. temp = str;
  56. while (*temp != 0) {
  57. start = temp;
  58. while (*temp != c && *temp != 0) temp++;
  59. len = temp - start;
  60. arr[i] = (char *)malloc((len + 1) * sizeof(char));
  61. strncpy(arr[i], start, len);
  62. arr[i][len] = 0;
  63. if (*temp == c) temp++;
  64. i++;
  65. }
  66. *res = arr;
  67. return count;
  68. }
  69. void Free_Strings(char **list, int count) {
  70. do {
  71. free(list[--count]);
  72. } while (count);
  73. }
  74. int Uart_Open(char *location) {
  75. int fd = open(location, O_RDWR | O_NOCTTY | O_NDELAY);
  76. if (fd == False) return False;
  77. // 恢复串口为阻塞状态
  78. if (fcntl(fd, F_SETFL, 0) < 0) return False;
  79. // 测试是否为终端设备
  80. if (0 == isatty(STDIN_FILENO)) return False;
  81. return fd;
  82. }
  83. int Uart_Set(int fd, int speed, int flow_ctrl, int data_bits, int stop_bits, int parity) {
  84. int i, status;
  85. int speed_arr[] = {B115200, B19200, B9600, B4800, B2400, B1200, B300};
  86. int name_arr[] = {115200, 19200, 9600, 4800, 2400, 1200, 300};
  87. struct termios options;
  88. if (tcgetattr(fd, &options) != 0) {
  89. printf("Error: SetupSerial 1");
  90. return False;
  91. }
  92. // 设置串口输入波特率和输出波特率
  93. for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++) {
  94. if (speed == name_arr[i]) {
  95. cfsetispeed(&options, speed_arr[i]);
  96. cfsetospeed(&options, speed_arr[i]);
  97. }
  98. }
  99. // 修改控制模式,保证程序不会占用串口
  100. options.c_cflag |= CLOCAL;
  101. // 修改控制模式,使得能够从串口中读取输入数据
  102. options.c_cflag |= CREAD;
  103. // 设置数据流控制
  104. switch (flow_ctrl) {
  105. case 0: // 不使用流控制
  106. options.c_cflag &= ~CRTSCTS;
  107. break;
  108. case 1: // 使用硬件流控制
  109. options.c_cflag |= CRTSCTS;
  110. break;
  111. case 2: // 使用软件流控制
  112. options.c_cflag |= IXON | IXOFF | IXANY;
  113. break;
  114. }
  115. // 设置数据位
  116. // 屏蔽其他标志位
  117. options.c_cflag &= ~CSIZE;
  118. switch (data_bits) {
  119. case 5:
  120. options.c_cflag |= CS5;
  121. break;
  122. case 6:
  123. options.c_cflag |= CS6;
  124. break;
  125. case 7:
  126. options.c_cflag |= CS7;
  127. break;
  128. case 8:
  129. options.c_cflag |= CS8;
  130. break;
  131. default:
  132. printf("Error: Unsupported data size\n");
  133. return False;
  134. }
  135. // 设置校验位
  136. switch (parity) {
  137. case 'n':
  138. case 'N': // 无奇偶校验位。
  139. options.c_cflag &= ~PARENB;
  140. options.c_iflag &= ~INPCK;
  141. break;
  142. case 'o':
  143. case 'O': // 设置为奇校验
  144. options.c_cflag |= (PARODD | PARENB);
  145. options.c_iflag |= INPCK;
  146. break;
  147. case 'e':
  148. case 'E': // 设置为偶校验
  149. options.c_cflag |= PARENB;
  150. options.c_cflag &= ~PARODD;
  151. options.c_iflag |= INPCK;
  152. break;
  153. case 's':
  154. case 'S': // 设置为空格
  155. options.c_cflag &= ~PARENB;
  156. options.c_cflag &= ~CSTOPB;
  157. break;
  158. default:
  159. printf("Error: Unsupported parity\n");
  160. return False;
  161. }
  162. // 设置停止位
  163. switch (stop_bits) {
  164. case 1:
  165. options.c_cflag &= ~CSTOPB;
  166. break;
  167. case 2:
  168. options.c_cflag |= CSTOPB;
  169. break;
  170. default:
  171. printf("Error: Unsupported stop bits\n");
  172. return False;
  173. }
  174. // 修改输出模式,原始数据输出
  175. options.c_oflag &= ~OPOST;
  176. options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  177. // 设置等待时间和最小接收字符
  178. options.c_cc[VTIME] = 1; /* 读取一个字符等待1*(1/10)s */
  179. options.c_cc[VMIN] = 1; /* 读取字符的最少个数为1 */
  180. // 如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
  181. tcflush(fd, TCIFLUSH);
  182. // 激活配置 (将修改后的termios数据设置到串口中)
  183. if (tcsetattr(fd, TCSANOW, &options) != 0) {
  184. printf("Error: com set error!\n");
  185. return False;
  186. }
  187. return True;
  188. }
  189. int Uart_Recv(int fd, char *rcv_buf, int data_len) {
  190. fd_set fs_read;
  191. FD_ZERO(&fs_read);
  192. FD_SET(fd, &fs_read);
  193. return read(fd, rcv_buf, data_len);
  194. }
  195. int Get_Mac(char *mac, int limit) {
  196. struct ifreq ifreq;
  197. int sock;
  198. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) return False;
  199. strcpy(ifreq.ifr_name, "eth0"); // Current eth0 only
  200. if (ioctl(sock, SIOCGIFHWADDR, &ifreq) < 0) return False;
  201. return snprintf(
  202. mac, limit, "%X%X%X%X%X%X", (unsigned char)ifreq.ifr_hwaddr.sa_data[0],
  203. (unsigned char)ifreq.ifr_hwaddr.sa_data[1], (unsigned char)ifreq.ifr_hwaddr.sa_data[2],
  204. (unsigned char)ifreq.ifr_hwaddr.sa_data[3], (unsigned char)ifreq.ifr_hwaddr.sa_data[4],
  205. (unsigned char)ifreq.ifr_hwaddr.sa_data[5]
  206. );
  207. }
  208. int main(void) {
  209. int ErrNo, UartFd, UartReadSize, SocketFd, SockReadSize, SockSendSize, tmp_;
  210. char MacAddr[18], SockReadBuff[BuffSize], SockSendBuff[BuffSize], UartRecvBuff[BuffSize], **SplitList, DeviceId[32];
  211. // 打开串口Uart
  212. UartFd = Uart_Open("/dev/ttyS0");
  213. if (UartFd == False) {
  214. printf("Error: Failed To Open Uart.\n");
  215. return False;
  216. }
  217. do {
  218. ErrNo = Uart_Set(UartFd, 115200, 0, 8, 1, 'N');
  219. } while (ErrNo == False || UartFd == False);
  220. // 阻塞式连接TCP
  221. struct sockaddr_in sin;
  222. bzero(&sin, sizeof(sin));
  223. sin.sin_family = AF_INET;
  224. inet_pton(AF_INET, "119.3.44.183", &sin.sin_addr);
  225. sin.sin_port = htons(8012);
  226. SocketFd = socket(AF_INET, SOCK_STREAM, 0);
  227. connect(SocketFd, (const struct sockaddr *)&sin, sizeof(sin));
  228. // init message exchange
  229. if (Get_Mac(MacAddr, 18) > 0) printf("Mac Addr: %s\n", MacAddr);
  230. else {
  231. printf("Error: Failed To Get Mac Addr.\n");
  232. close(UartFd);
  233. return False;
  234. }
  235. memset(SockSendBuff, 0, BuffSize);
  236. SockSendSize = sprintf(SockSendBuff, "hm+%s+1+7+end", MacAddr);
  237. write(SocketFd, SockSendBuff, SockSendSize);
  238. SockReadSize = read(SocketFd, SockReadBuff, BuffSize);
  239. SockReadBuff[SockReadSize] = 0;
  240. tmp_ = Str_Split(SockReadBuff, '+', &SplitList);
  241. strcpy(DeviceId, SplitList[3]);
  242. Free_Strings(SplitList, tmp_);
  243. // 循环读串口数据
  244. memset(SockSendBuff, 0, BuffSize);
  245. while (1) {
  246. UartReadSize = Uart_Recv(UartFd, UartRecvBuff, BuffSize);
  247. if (UartReadSize > 0) {
  248. UartRecvBuff[UartReadSize] = 0;
  249. strcat(SockSendBuff, UartRecvBuff);
  250. if (strstr(UartRecvBuff, "end")) {
  251. tmp_ = Str_Split(SockSendBuff, '+', &SplitList);
  252. Time *now = Now_Time();
  253. SockSendSize = sprintf(
  254. SockSendBuff, "%s+%s+%s+%s+0+0+%s+%s+%d%02d%02d%02d%02d%02d+1.0#%s#%s+%s+%s",
  255. SplitList[0], DeviceId, SplitList[2], SplitList[4], SplitList[5], SplitList[6],
  256. now->year, now->month, now->day, now->hour, now->minute, now->second,
  257. SplitList[7], SplitList[3], SplitList[8], SplitList[9]
  258. );
  259. SockSendBuff[SockSendSize] = 0;
  260. write(SocketFd, SockSendBuff, SockSendSize);
  261. free(now);
  262. Free_Strings(SplitList, tmp_);
  263. memset(SockSendBuff, 0, BuffSize);
  264. }
  265. }
  266. }
  267. close(UartFd);
  268. }