求教:protues8.0+vsdp+串口调试助手,STM32只能正常接收第一个数据
求教:protues8.0+vsdp+串口调试助手,STM32只能正常接收第一个数据
在protues中添加STM32F103R6芯片、添加COMPIM串口、LED显示灯。使用U5编写串口通信程序,将编写好的程序下载到protues中,时钟均设置为8M,串口波特率设置为9600。开始模拟后,可以收到串口发送的数据,但是发送串口数据给STM32后,再将数据再发送,只有第一位数据是正确的。
一、Protues配置
Protues8.0。

芯片选择STM32103R6,晶振选择8M,COMPIM波特率选择9600,D1为发送数据时闪烁,D2上电点亮,接收数据后灭。
二、程序
1.串口中断程序
代码如下(示例):
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); //读取接收到的数据
USART_RX_BUF[USART_RX_STA]=Res ;
USART_RX_STA++;
if(USART_GetITStatus(USART1, USART_IT_RXNE) == RESET)
{
bj=1;LED1=1;return;
}
Res=0;
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
判断串口有接收标志,接收数据,当没有接收标志时候跳出串口中断,并bj=1(标记位置1)。
注:根据正点原子函数库修改的,USART_RX_STA第15位无法置位,测试时候发现if(Res!=0x0a)这个判断无法成功。
2.主函数接收发送数据
while(1)
{
if(bj==1)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[0]); //发送收到的第1个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[1]); //发送收到的第2个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[2]); //发送收到的第3个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[3]); //发送收到的第4个数据
printf("\r\n\r\n");//插入换行
printf("%d",USART_RX_STA); //发送收到了几个数据(计数从0开始,实际数据-1)
printf("\r\n\r\n");//插入换行
bj=0; //发送结束,标记为清零
USART_RX_STA=0; //计数器清零
}else
{
times++;
if(times%5000==0)
{
printf("\r\n精英STM32开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
3.串口数据显示结果


收到数据后再发送,只有第一位数据正确,数据量正确,不知道为什么,问正点原子的客服也不知道为什么。
求大神解答。
————————————————
版权声明:本文为CSDN博主「紫辰风铃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_55781693/article/details/114534737
在protues中添加STM32F103R6芯片、添加COMPIM串口、LED显示灯。使用U5编写串口通信程序,将编写好的程序下载到protues中,时钟均设置为8M,串口波特率设置为9600。开始模拟后,可以收到串口发送的数据,但是发送串口数据给STM32后,再将数据再发送,只有第一位数据是正确的。
一、Protues配置
Protues8.0。

芯片选择STM32103R6,晶振选择8M,COMPIM波特率选择9600,D1为发送数据时闪烁,D2上电点亮,接收数据后灭。
二、程序
1.串口中断程序
代码如下(示例):
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); //读取接收到的数据
USART_RX_BUF[USART_RX_STA]=Res ;
USART_RX_STA++;
if(USART_GetITStatus(USART1, USART_IT_RXNE) == RESET)
{
bj=1;LED1=1;return;
}
Res=0;
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
判断串口有接收标志,接收数据,当没有接收标志时候跳出串口中断,并bj=1(标记位置1)。
注:根据正点原子函数库修改的,USART_RX_STA第15位无法置位,测试时候发现if(Res!=0x0a)这个判断无法成功。
2.主函数接收发送数据
while(1)
{
if(bj==1)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[0]); //发送收到的第1个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[1]); //发送收到的第2个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[2]); //发送收到的第3个数据
printf("\r\n\r\n");//插入换行
printf("%c",USART_RX_BUF[3]); //发送收到的第4个数据
printf("\r\n\r\n");//插入换行
printf("%d",USART_RX_STA); //发送收到了几个数据(计数从0开始,实际数据-1)
printf("\r\n\r\n");//插入换行
bj=0; //发送结束,标记为清零
USART_RX_STA=0; //计数器清零
}else
{
times++;
if(times%5000==0)
{
printf("\r\n精英STM32开发板 串口实验\r\n");
printf("正点原子@ALIENTEK\r\n\r\n");
}
if(times%200==0)printf("请输入数据,以回车键结束\n");
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);
}
3.串口数据显示结果


收到数据后再发送,只有第一位数据正确,数据量正确,不知道为什么,问正点原子的客服也不知道为什么。
求大神解答。
————————————————
版权声明:本文为CSDN博主「紫辰风铃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_55781693/article/details/114534737
...全文
相关推荐
protues仿真,基于stm32f103r6的串口通信,支持数据收发,数码管显示
在protues平台,使用串口通信实现数据的交互,然后通过数码管显示数据,如果需要与串口调试助手链接,需要下载VSPD虚拟串口软件,下载及使用方式很容易找到,不做赘述。工程是基于STM32CubeMX
STM32CubeMx+Protues+VSPD仿真实现调试串口
在Protues中,你可以通过查看波形或者状态来检查UART的发送和接收是否正常。然后,安装并配置VSPD,创建一对虚拟串口,将其一端连接到STM32的仿真模型,另一端连接到你的PC。
基于stm32的电机调速与正反转(含有protues仿真)
Protues仿真:掌握如何在虚拟环境中构建和测试STM32电机控制系统。5. 嵌入式系统编程:编写并调试控制电机的C/C++代码。
stm32串口实验+protues仿真.zip
在进行串口实验和Protues仿真时,可能会遇到的问题包括:波特率不匹配导致的数据丢失,串口初始化错误,以及在Protues中模型连接不当等。
stm32的温湿度检测protues仿真
8. **中断处理**:为了高效地处理DHT11的数据传输,可能需要在STM32中设置中断服务例程。当串口接收完成一个数据包时,中断会被触发,然后执行相应的处理代码。9.


单片机/工控
