OpenEdv-开源电子网

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

串口接收数据出错

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-12-5
在线时间
7 小时
发表于 2018-12-16 22:42:09 | 显示全部楼层 |阅读模式
1金钱
在进行串口接收数据的实验里,用原子哥提供的usart.c,波特率115200,修改的地方如下:
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _ttywrch(int ch)
{
ch = ch;
}
void _sys_exit(int x)
{
        x = x;
}
这里添加void _ttywrch(int ch) 是为了防止报错,另外一个改动的地方在回调函数里面:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(aRxBuffer[0]!=0x0a)
                                {
                                        USART_RX_STA=0;//接收错误,重新开始
                                        printf("接收错误,重新开始\r\n");
                                }
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }
                        else //还没收到0X0D
                        {       
                                if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0];
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))
                                        {
                                                USART_RX_STA=0;//接收数据错误,重新开始接收
                                                printf("接收数据错误,重新开始接收\r\n");
                                        }
                                        printf("USART_RX_STA = %d\taRxBuffer = %c\r\n", USART_RX_STA, aRxBuffer[0]);
                                }                 
                        }
                }
        }
}

这里添加printf是为了分析错误原因。主函数里面循环为:
while(1)
    {
        if(USART_RX_STA&0x8000)
        {
                printf("发送的数据为:\r\n");
                HAL_UART_Transmit(&UART1_Handler, (u8*)USART_RX_BUF, USART_RX_STA&0X3FFF, 1000);
                while(__HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_TC)!=SET);
                printf("\r\n");
                USART_RX_STA=0;
        }
    }

下载到板子里,发送数据为12345,发送新行,打印出的消息是这样的:


delay_ms(1000) = 1000.23 ms[2018-12-16 10:32:09.463]
USART_RX_STA = 1        aRxBuffer = 1[2018-12-16 10:32:12.549]
发送的数据为:[2018-12-16 10:32:14.703]
1[2018-12-16 10:32:14.703]
USART_RX_STA = 1        aRxBuffer = 1[2018-12-16 10:32:15.027]
USART_RX_STA = 2        aRxBuffer = 2[2018-12-16 10:32:16.040]
USART_RX_STA = 3        aRxBuffer =
[2018-12-16 10:32:17.075]
USART_RX_STA = 4        aRxBuffer = 2[2018-12-16 10:32:17.941]
USART_RX_STA = 5        aRxBuffer = 3[2018-12-16 10:32:18.592]
USART_RX_STA = 6        aRxBuffer = 3[2018-12-16 10:32:19.153]
USART_RX_STA = 7        aRxBuffer = 3[2018-12-16 10:32:19.641]
USART_RX_STA = 8        aRxBuffer = 1[2018-12-16 10:32:20.112]
USART_RX_STA = 9        aRxBuffer = 4[2018-12-16 10:32:20.560]
USART_RX_STA = 10        aRxBuffer = 4[2018-12-16 10:32:21.156]
USART_RX_STA = 11        aRxBuffer = 1[2018-12-16 10:32:27.179]
USART_RX_STA = 12        aRxBuffer = 4[2018-12-16 10:32:28.158]


每点一下发送按钮,就打印一行信息。猜想程序接收到1个字符后没有继续接收。
请各位大神指点。

360截图20181216223614269.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2018-12-16 22:54:36 | 显示全部楼层
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-12-5
在线时间
7 小时
 楼主| 发表于 2018-12-16 23:16:22 | 显示全部楼层
补充:用原子哥自带的   2,标准例程-HAL库版本\实验3 串口通信实验  ,修改为内部高速时钟,LED0修改为LED1,usart.c中未进行任何修改,最后串口助手打印的消息也是错误,现象与上面类似,怀疑原子哥例程有错,附上代码,请大神指点。
file:///C:/Users/91434/Pictures/360%E6%88%AA%E5%9B%BE20181216230807217.jpg

串口打印的信息

串口打印的信息

实验3 串口通信实验.zip

8.72 MB, 下载次数: 18

工程

回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-12-5
在线时间
7 小时
 楼主| 发表于 2018-12-16 23:17:15 | 显示全部楼层

没有printf也不能打印正确的信息
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-17 01:44:43 | 显示全部楼层
printf不要放串口中断服务函数里面!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-12-5
在线时间
7 小时
 楼主| 发表于 2018-12-17 12:38:25 | 显示全部楼层
正点原子 发表于 2018-12-17 01:44
printf不要放串口中断服务函数里面!!

原子哥麻烦你运行一下3楼的程序,把内部晶振改为你的外部晶振,看看这个例程是不是能正常接收串口数据,这个工程里的uart.c完全没有改动,但在我这儿接收不成功。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-12-12
在线时间
14 小时
发表于 2018-12-17 16:51:40 | 显示全部楼层
我移植的这个程序也用不了,不知道是哪里出错了
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-12-5
在线时间
7 小时
 楼主| 发表于 2018-12-17 17:46:10 | 显示全部楼层
wang51950 发表于 2018-12-17 16:51
我移植的这个程序也用不了,不知道是哪里出错了

共勉@正点原子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-18 01:54:16 | 显示全部楼层

回到最原始的,下载我们例程,看OK不?
然后再慢慢改,改一点测试下。
改一点测试下,这样找问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 13:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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