OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6966|回复: 6

debian 系统下串口,发送数据异常

[复制链接]

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2021-3-22 17:57:05 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 htao 于 2021-3-23 09:16 编辑

在debian 系统下,使用串口2,串口3都试过,使用 gettimeofday 函数,过1000ms 发送一次数据。

问题描述:开机之后,程序发送的数据无法到达串口终端,很多条数据可能只到达一条,没有规律。经过一段时间(时间不确定,一般是半个小时左右)以后,程序发送数据正常,终端正常显示。
接收数据本来有问题,后面配置了串口的配置参数,使其接收原始数据,才不会丢失特殊字符。

程序如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/stat.h>
  6. #include <sys/types.h>
  7. #include <termios.h>
  8. #include <string.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/time.h>
  11. #include <termios.h>

  12. int usart_init(char * path);

  13. //根据具体的设备修改
  14. const char default_screen_path[] = "/dev/ttymxc2";

  15. void main(void)
  16. {
  17. unsigned char buf[250] = "Embedfire tty send test.01234567899876543210 abcdefghijklmnopqrstuvwxyz.\n";
  18. struct timeval start, end;
  19. int interval;

  20. //串口初始化
  21. int usart_fd = usart_init((char *)default_screen_path);
  22. if (usart_fd == 0)
  23. {
  24. printf("usart '%s' init failed", default_screen_path);
  25. }

  26. //tv_sec 单位秒 tv_usec 单位微秒,最大1000000
  27. gettimeofday(&start, NULL);

  28. while (1)
  29. {
  30. //系统计时 200ms 发送一条数据
  31. gettimeofday(&end, NULL);
  32. interval = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_usec - start.tv_usec) / 1000;
  33. if (interval > 1000)
  34. {
  35. // send message
  36. write(usart_fd, buf, sizeof(buf));
  37. printf("interval = %d\n", interval);
  38. interval = 0;
  39. gettimeofday(&start, NULL);
  40. }
  41. }

  42. close(usart_fd);
  43. return NULL;
  44. }

  45. //串口初始化
  46. int usart_init(char *path)
  47. {
  48. int fd;
  49. int res;
  50. struct termios opt;

  51. //获取串口设备描述符
  52. fd = open(path, O_RDWR | O_NOCTTY | O_NONBLOCK, 0777);
  53. if (fd < 0)
  54. {
  55. printf("Fail to Open %s device\n", path);
  56. return 0;
  57. }
  58. printf("open %s is successed\n", path);

  59. //清空串口接收缓冲区
  60. tcflush(fd, TCIOFLUSH);
  61. // 获取串口参数opt
  62. tcgetattr(fd, &opt);

  63. //设置串口输出波特率
  64. cfsetospeed(&opt, B115200);
  65. //设置串口输入波特率
  66. cfsetispeed(&opt, B115200);
  67. //设置数据位数
  68. opt.c_cflag &= ~CSIZE;
  69. opt.c_cflag |= CS8;
  70. //校验位
  71. opt.c_cflag &= ~PARENB;
  72. opt.c_iflag &= ~INPCK;
  73. //设置停止位
  74. opt.c_cflag &= ~CSTOPB;

  75. // &= 关闭 |= 设置
  76. //如果设置,使能规范输入,否者使用原始数据
  77. //opt.c_lflag &= ~ICANON;
  78. opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  79. //如果设置,将NL转换成CR-NL后输出
  80. opt.c_oflag &= ~ONLCR;
  81. //如果设置,将接收到的NL(换行)转换成CR(回车)。
  82. opt.c_iflag &= ~INLCR;
  83. //最少可读数据
  84. opt.c_cc[VMIN] = 0;
  85. //等待数据时间(10秒的倍数)
  86. opt.c_cc[VTIME] = 0;
  87. //如果设置,则忽略接收到的break信号
  88. opt.c_iflag |= IGNBRK;
  89. //如果设置,则启用实现自定义的输入处理
  90. opt.c_lflag &= ~IEXTEN;
  91. //如果设置,则禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列
  92. opt.c_lflag |= NOFLSH;

  93. opt.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL);

  94. //使用原始数据输出
  95. opt.c_oflag &= ~OPOST;

  96. //更新配置
  97. if(tcsetattr(fd, TCSANOW, &opt) != 0)
  98. {
  99. printf("init error...........\n");
  100. return -1;
  101. }

  102. return fd;
  103. }
复制代码





正常的截图如下:
11.png

不正常的就是debian 的终端打印了很多条, 串口终端才打印很少的数据。 22.png



最佳答案

查看完整内容[请看2#楼]

经过测试,串口2和串口3同时相连,串口3的发送才正常,对应原理图,看了下引脚都正常连接,不知道其他的 pro 板是不是有问题。 应该不是代码的问题了
茵茵猪头
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2021-3-22 17:57:06 | 显示全部楼层
经过测试,串口2和串口3同时相连,串口3的发送才正常,对应原理图,看了下引脚都正常连接,不知道其他的 pro 板是不是有问题。

应该不是代码的问题了
茵茵猪头
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-3-22 18:36:49 | 显示全部楼层
这边帮顶一下!
回复

使用道具 举报

9

主题

767

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5274
金钱
5274
注册时间
2019-9-25
在线时间
433 小时
发表于 2021-4-6 09:25:30 | 显示全部楼层
原子的串口2是用复用作spi,连接到六轴传感器上了,你可以不用它,把它拆了试试
想思考的时候,有时还可以用屁股,QQ 1252699831
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
发表于 2021-4-7 10:08:58 | 显示全部楼层
您好,楼主,LWIP多任务问题请教一下。可以加一下Q嘛 809485914 谢谢!
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2021-4-7 10:23:14 | 显示全部楼层
hanxi0529 发表于 2021-4-7 10:08
您好,楼主,LWIP多任务问题请教一下。可以加一下Q嘛 809485914 谢谢!

http://www.openedv.com/forum.php?mod=viewthread&tid=233861
茵茵猪头
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-4-15
在线时间
12 小时
发表于 2021-4-12 09:02:34 | 显示全部楼层
htao 发表于 2021-4-7 10:23
http://www.openedv.com/forum.php?mod=viewthread&tid=233861

您好,因为测试ETH,所以chuleUART1外设,其他均无。只存在UART1+ETH。。。现在出现一个问题,就是吊桶send函数,没有规律性ETH死掉。send函数返回-4这个err偶尔也会有-8,通过助手查看。有些时候接收到20W字节(20ms一个周期,字节17个)ETh会死掉。但是系统无问题。有的时候300W字节死掉。,没有什么规律。但是反馈的错误是-4(send函数),目前不知道该如何下手,请指导!谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表