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

2019-07-20 23:12发布

本帖最后由 水影寒冰 于 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自发自收数据的情况(RXDTXD)和32自发自收(PA9PA10)的情况。
发现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(" ");则32能够正常收发。
这说明32有一个默认终止符 。
所以我们在MATLAB的程序中要加上 终止符。
%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的代码可直接使用原子串口例程。

各位老友们如果觉得有帮助的话 ,可以多多支持!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。