OpenEdv-开源电子网

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

关于stm32f103连续接收数据问题

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2024-6-28
在线时间
3 小时
发表于 2024-6-28 10:21:11 | 显示全部楼层 |阅读模式
使用串口助手发送数据:wr,1,0,100,0,1,1,3,0,3,0,1,100,0,100,0,100,0,65536,0,1,0,0,0,0,0,2,1,1,2,0,16,0,0,0,1,0,1,
单次发送一切正常,在间隔1s连续发送时出现接收出错的情况,该如何解决

中断函数如下:

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();
#endif

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                Res = USART_ReceiveData(USART1);        //读取接收到的数据
                //printf("%c", Res);

                if((USART_RX_STA & 0x8000) == 0) { //接收未完成
                        if(USART_RX_STA & 0x4000) { //接收到了0x0d
                                if(Res != 0x0a) //接收错误,重新开始
                                        USART_RX_STA = 0;
                                else USART_RX_STA |= 0x8000;        //接收完成了
                        }
                        else { //还没收到0X0D
                                if(Res == 0x0d)
                                        USART_RX_STA |= 0x4000;
                                else {
                                        USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res ;
                                        USART_RX_STA++;

                                        if(USART_RX_STA > (USART_REC_LEN - 1))                //接收数据错误,重新开始接收
                                                USART_RX_STA = 0;
                                }
                        }
                }
        }

#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();
#endif
}
#endif



如图

如图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8184
金钱
8184
注册时间
2020-5-11
在线时间
3697 小时
发表于 2024-6-29 10:25:18 | 显示全部楼层
主函数呢?处理数据的代码呢?
专治疑难杂症
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2024-6-28
在线时间
3 小时
 楼主| 发表于 2024-6-29 11:02:08 | 显示全部楼层
LcwSwust 发表于 2024-6-29 10:25
主函数呢?处理数据的代码呢?
  1. #define         LEN_CMD                        50
  2. #define                LEN_CMD_STR                10

  3. void  br9172SpiWrite(u8 *ReceveData){
  4. char temp_buf[LEN_CMD][LEN_CMD_STR];

  5. recv_str = ReceveData;

  6.         for(i = 0; i < 38; i++) {
  7.                 for(j = 0; j < 20; j++) {
  8.                         temp_buf[i][j] = recv_str[j];

  9.                         if( recv_str[j] == ',') {

  10.                                 temp_buf[i][j] = '\0';
  11.                                 recv_str = recv_str + j + 1;
  12.                                 break;
  13.                         }
  14.                 }
  15.         }
  16. }
复制代码

接收过来,根据逗号分隔开
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8184
金钱
8184
注册时间
2020-5-11
在线时间
3697 小时
发表于 2024-6-29 11:17:23 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-6-29 11:20 编辑
bonray 发表于 2024-6-29 11:02
接收过来,根据逗号分隔开

这些代码和"cmd is wrong"有啥关系?
这代码里的j是不是应小于 LEN_CMD_STR?
如果字符串前方20字节里找不到逗号是不是还会有BUG?
专治疑难杂症
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2024-6-28
在线时间
3 小时
 楼主| 发表于 2024-6-29 11:20:29 | 显示全部楼层
LcwSwust 发表于 2024-6-29 11:17
这些代码和"cmd is wrong"有啥关系?
这代码里的j是不是应小于 LEN_CMD_STR?

cmd就是wr,读不到就是wrong,这是后面的了,都是一些计算处理过程
j不管小于多少,读到‘,’就直接跳出内层循环了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2024-6-28
在线时间
3 小时
 楼主| 发表于 2024-6-29 11:23:28 | 显示全部楼层
LcwSwust 发表于 2024-6-29 11:17
这些代码和"cmd is wrong"有啥关系?
这代码里的j是不是应小于 LEN_CMD_STR?
如果字符串前方20字节里找 ...

字符串前20不可能没有逗号,发送的数据都是编好的
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2024-6-28
在线时间
3 小时
 楼主| 发表于 2024-6-29 11:32:18 | 显示全部楼层
LcwSwust 发表于 2024-6-29 11:17
这些代码和"cmd is wrong"有啥关系?
这代码里的j是不是应小于 LEN_CMD_STR?
如果字符串前方20字节里找 ...
  1. strcpy(cmd, &temp_buf[0][0]);                                        // 获取命令
  2. ...... //省略其他变量赋值
  3. if(strcmp(cmd, "rd") == 0) {
  4. ......
  5. }
  6. else if((strcmp(cmd, "rd_reg") == 0){
  7. ......
  8. }
  9. else if(strcmp(cmd, "wr") == 0){
  10. ......
  11. }
  12. else {
  13.                         printf("cmd = %s, operate fail, cmd is wrong!\r\n\r\n", cmd);
  14.                 }
复制代码
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8184
金钱
8184
注册时间
2020-5-11
在线时间
3697 小时
发表于 2024-6-29 11:39:46 | 显示全部楼层

那你这些代码什么时候运行?
收到指令后多长时间会运行?
循环调用这些代码的间隔时间多长?
有没有其它事情导致间隔大于1秒钟?
有没有示波器?
专治疑难杂症
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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