OpenEdv-开源电子网

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

matlab和32串口通信,32却接收不到数据??!RXNE不置1?!原因竟然如此简单!!!

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2018-2-22
在线时间
7 小时
发表于 2019-5-21 16:09:07 | 显示全部楼层 |阅读模式
本帖最后由 水影寒冰 于 2019-6-10 13:57 编辑

楼主最近用MATLAB和32进行串口通信,却发现MATLAB可以接受32的数据,32却接受不到MATLAB的数据。查遍网络及各大论坛(原子)无果后,于是找了身边的大神帮忙,大神对着我的32板子一顿戳,终于找出了问题所在。
我先描述一下遇到的一些问题。如果不想看我的口水话,可以直接翻到最后看我黑体加粗的代码。
首先我写的MATLAB代码如下:

delete(instrfindall('Type','serial'));
data=33;
s = serial('COM4');
set(s,'BaudRate',115200,'databits',8,'parity','none','stopbits',1,...
    'terminator','CR/LF','FlowControl','none');
fopen(s);
fwrite(s,data,'uint8');
[cmd_ack,cnt,msg] = fread(s,1,'uint8');
fclose(s);
delete(s)
clear s


32代码使用的是原子的串口例程。
然后发现32没办法接受到matlab发送的数据,接着就开始头秃了两个晚上。
我先是尝试了修改matlab串口的各种属性,还让32直接将收到的数据发送出来,跳过了USART_RX_STA的判断
{
        //32跳过了USART_RX_STA(尝试,非解决办法)
        rec = USART_ReceiveData( USART1 );
        USART_SendData(USART1, rec);
}
然后再matlab这边看rec是不是对的,然鹅,还是卵用莫得
然后我再CDNS上搜了一下,发现了这两行代码。
%MATLAB,调DTS和RTS
s.DataTerminalReady='off';
s.RequestToSend='off';

惊喜的发现rec有返回的值i,虽然是乱的,比如:0 、10、33、72这样的,虽然跟实际值33有差别,用原子代码试发现标志位RXNE还是0,并没有检测发送完成标志,但至少有点反应。
是不是觉得可以有点高兴了,我提前跟你剧透和这个方法半毛钱关系都没有,至于它为啥有反应具体原因我也不清楚,所以最后我去请教了大神。

我们用示波器看了一下matlab自发自收数据的情况(RXD\TXD)和32自发自收(PA9\PA10)的情况。
发现matlab是没有问题的,问题在32的代码上。
{
                //32自发自收数据的代码
                USART_SendData(USART1,0xaa);
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        for(t=0;t<len;t++)
                        {
                                USART_SendData(USART1, USART_RX_BUF[t]);      
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                        LED1=!LED1;
                        USART_RX_STA=0;
                }
}
32没反应,但在第二行加上一句printf("\r\n");则32能够正常收发。
这说明32有一个默认终止符\r\n。
所以我们在MATLAB的程序中要加上\r\n终止符。
%MATLAB:使用fwrite向32写数据。
fwrite(s,data,'uint8');         //传送数据
fwrite(s,[13,10],'uint8');    //向32传输终止符

[cmd_ack,cnt,msg] = fread(s,3,'uint8');
此时标志位RXNE置1,通信能够正常进行。
(补充:如果要去掉这个终止符,就要修改串口中断程序)

完整MATLAB代码:
delete(instrfindall('Type','serial'));
data=65;
s = serial('COM4');
set(s,'BaudRate',115200,'databits',8,'parity','none','stopbits',1,...
    'terminator','CR/LF','FlowControl','none');
fopen(s);
fwrite(s,data,'uint8');
fwrite(s,[13,10],'uint8');
[cmd_ack,cnt,msg] = fread(s,5,'uint8');
fclose(s);
delete(s)
clear s


32的代码可直接使用原子串口例程。

各位老友们如果觉得有帮助的话 ,可以多多支持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10568
金钱
10568
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-5-21 20:00:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-7-23
在线时间
18 小时
发表于 2019-7-5 15:30:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2019-5-20
在线时间
23 小时
发表于 2019-12-13 10:56:47 | 显示全部楼层
非常有用的,真的非常感谢,厉害
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-7-24
在线时间
6 小时
发表于 2020-2-8 21:10:42 | 显示全部楼层
厉害,赞
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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