最近因为学习任务的原因需要使用matlab做上位机步调与stm32单片机通信,可是实现过程中出现了希奇的问题,具体描述如下:
在烧录好stm32端步调后,可以通过各种串口调试助手实现数据的收发,功能正常。可是在使用matlab进行串口操作时,却什么信息也收不到,也无法向单片机写入数据。
以下分别是当时我使用的stm32端和matlab端的试验性步调:
stm32端试验性步调:
- while(1){ i++; if(i%5000==0) { USART_SendData(USART1,1234); } if(i%200==0) {USART_SendData(USART1,49); delay_ms(10); }
复制代码 matlab端试验性步调:
- function SerialFuc() % 创建函数 delete(instrfindall) global s; % 全局变量,供串口中断函数使用 s = serial('com5'); %使用默认设置创建串口s set(s ,'BaudRate',115200); set(s,'BytesAvailableFcnMode','Byte'); set(s,'BytesAvailableFcnCount',30); s.BytesAvailableFcn = @Callback; % 界说中断响应函数对象 fopen(s);%打开串口 A=78; for i =1:1:5 pause(3); disp('haha'); end fclose(s);endfunction Callback (obj,event) %创建中断响应函数 a=fread(obj,3,'uint8'); disp(a);end
复制代码 在进行了多天尝试以后,终于发现了问题所在:普中PZ6806L开辟板的硬件设计出了问题。在通过USB进行串口通信时,matlab打开串口的方式会使得单片机DTR被连续拉高,致使无法正常收发数据。如果多尝试使用几种串口助手与这个型号的开辟板通信的话,可能也会遇到换一种串口助手就没有办法正常通信的情况。
找到问题之后办理方法就非常简朴:就是通过上位机将DTR的电平拉高之后再释放。如果是使用串口助手时遇到了这样的问题,就在串口助手的选项里选中DTR再将其取消选中。
如果是使用matlab通信时遇到这样的问题,就通过控制serial对象的DataTerminalReady属性来达到同样的效果:
s.DataTerminalReady = ‘on’;
s.DataTerminalReady = ‘off’;`
在matlab 2019b以上版本可以使用setDTR(device,true)
setDTR(device,false)函数来直接设置DTR状态。
一般情况下,在使用matlab与单片机实现串口通信时,只要设置好了符合的波特率,上位机端和下位机端的数据格式,matlab步调里的响应触发方式(查询方式或中断方式),另有数据位数,停止位,校验位这些参数之后,一般都不会出现什么问题。如果你也很不幸的遇到了各种奇希奇怪的问题,请不要心急,先尝试使用一个功能简朴的试验性步调测试,逐项排查问题。在排查matlab端问题时要多关注serial对象的属性,使用get(obj)函数来查察串口对象的属性,查察属性是否设置正确。实在找不出问题可以思量换一块单片机和数据线试试来清除硬件故障的可能。
来源:https://blog.csdn.net/jzk_csdn/article/details/111829637
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |