[关闭]
@cyysu 2018-07-30T06:12:05.000000Z 字数 2840 阅读 817

Linux应用系列教程-串口测试

  • 时间:2017年10月30日10:30:34
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
  • 版本:4.0
  • 描述:测试ARM板串口通信小程序

Linux应用系列教程


代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. #include<unistd.h>
  8. #include<termios.h>
  9. #include<string.h>
  10. #include <stdint.h>
  11. // 设置一些串口信息
  12. int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop) {
  13. struct termios newtio, oldtio;
  14. if (tcgetattr(fd, &oldtio) != 0) {
  15. perror("SetupSerial 1");
  16. return -1;
  17. }
  18. bzero(&newtio, sizeof(newtio));
  19. newtio.c_cflag |= CLOCAL | CREAD; //CLOCAL:忽略modem控制线 CREAD:打开接受者
  20. newtio.c_cflag &= ~CSIZE; //字符长度掩码。取值为:CS5,CS6,CS7或CS8
  21. // 数据位
  22. switch (nBits) {
  23. case 7:
  24. newtio.c_cflag |= CS7;
  25. break;
  26. case 8:
  27. newtio.c_cflag |= CS8;
  28. break;
  29. }
  30. // 校验信息
  31. switch (nEvent) {
  32. case 'O':
  33. newtio.c_cflag |= PARENB; //允许输出产生奇偶信息以及输入到奇偶校验
  34. newtio.c_cflag |= PARODD; //输入和输出是奇及校验
  35. newtio.c_iflag |= (INPCK | ISTRIP); // INPACK:启用输入奇偶检测;ISTRIP:去掉第八位
  36. break;
  37. case 'E':
  38. newtio.c_iflag |= (INPCK | ISTRIP);
  39. newtio.c_cflag |= PARENB;
  40. newtio.c_cflag &= ~PARODD;
  41. break;
  42. case 'N':
  43. newtio.c_cflag &= ~PARENB;
  44. break;
  45. }
  46. // 串口波特率
  47. switch (nSpeed) {
  48. case 2400:
  49. cfsetispeed(&newtio, B2400);
  50. cfsetospeed(&newtio, B2400);
  51. break;
  52. case 4800:
  53. cfsetispeed(&newtio, B4800);
  54. cfsetospeed(&newtio, B4800);
  55. break;
  56. case 9600:
  57. cfsetispeed(&newtio, B9600);
  58. cfsetospeed(&newtio, B9600);
  59. break;
  60. case 115200:
  61. cfsetispeed(&newtio, B115200);
  62. cfsetospeed(&newtio, B115200);
  63. break;
  64. case 460800:
  65. cfsetispeed(&newtio, B460800);
  66. cfsetospeed(&newtio, B460800);
  67. break;
  68. default:
  69. cfsetispeed(&newtio, B9600);
  70. cfsetospeed(&newtio, B9600);
  71. break;
  72. }
  73. // 停止位
  74. if (nStop == 1)
  75. newtio.c_cflag &= ~CSTOPB; //CSTOPB:设置两个停止位,而不是一个
  76. else if (nStop == 2)
  77. newtio.c_cflag |= CSTOPB;
  78. //1、 MIN = 0 , TIME =0 有READ立即回传否则传回 0 ,不读取任何字元
  79. //2、 MIN = 0 , TIME >0 READ 传回读到的字元,或在十分之一秒后传回TIME若来不及读到任何字元,则传回0
  80. //3、 MIN > 0 , TIME =0 READ 会等待,直到MIN字元可读
  81. //4、 MIN > 0 , TIME > 0 每一格字元之间计时器即会被启动READ 会在读到MIN字元,传回值或TIME的字元计时(1/10秒)超过时将值 传回
  82. newtio.c_cc[VTIME] = 0; //VTIME:非cannoical模式读时的延时,以十分之一秒位单位
  83. newtio.c_cc[VMIN] = 0; //VMIN:非canonical模式读到最小字符数
  84. tcflush(fd, TCIFLUSH); // 改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃。
  85. if ((tcsetattr(fd, TCSANOW, &newtio)) != 0) //TCSANOW:改变立即发生
  86. {
  87. perror("com set error");
  88. return -1;
  89. }
  90. printf("set done!\n\r");
  91. return 0;
  92. }
  93. //小端返回0 大端返回1
  94. uint16_t checkCPUendian(){
  95. union
  96. {
  97. uint16_t a;
  98. uint8_t b;
  99. }c;
  100. c.a = 1;
  101. return !(c.b == 1);
  102. }
  103. int main(void) {
  104. int fd1, nset, nread, ret;
  105. char buf[100] = { "serial data\n" };
  106. char buf1[100];
  107. // 测试程序大小端
  108. printf("this cpu is big/little endian:%d(1:big0:little)\n",checkCPUendian());
  109. // 打开串口设备
  110. fd1 = open("/dev/ttyS0", O_RDWR);
  111. if (fd1 == -1)
  112. exit(1);
  113. printf("open SAC0 success!!\n");
  114. // 设置波特率的信息,这里测试时可以不用设置
  115. nset = set_opt(fd1, 9600, 8, 'N', 1);
  116. if (nset == -1)
  117. exit(1);
  118. printf("SET SAC0 success!!\n");
  119. while (1)
  120. {
  121. // 清空串口接受缓存区
  122. memset(buf1, 0, sizeof(buf1));
  123. // 向设备写入信息
  124. ret = write(fd1, buf, 100);
  125. if (ret > 0) {
  126. printf("write success! wait data receive\n");
  127. }
  128. // 读取数据
  129. nread = read(fd1, buf1, 100);
  130. if (nread > 0) {
  131. printf("redatad: nread = %s\n\n\r", buf1);
  132. }
  133. sleep(1);
  134. }
  135. close(fd1);
  136. return 0;
  137. }

关于termios这个结构体的信息可以查看下面这个链接:

http://blog.csdn.net/mr_raptor/article/details/8349323

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注