OpenEdv-开源电子网

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

串口通讯问题

[复制链接]

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
发表于 2012-4-17 18:19:18 | 显示全部楼层 |阅读模式
上位机与下位机通讯
之前我写的下位机是用的Sonix汇编语言写的,上位机是用Qt写的
现在MCU改为STM32了,因本人对于STM32是新手,想请教如何进行与上位机的通讯

通讯协议是我自己定义的:preable  cmd length crc , 比如 上位机发送:aa 01 04 af    单片机返回:aa 01 05 01 b0
请问如何接受这四个字节及发送返回值,我上位机是用的结构体设计的

请有过经验的指导一下,谢谢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-17 22:50:25 | 显示全部楼层
回复【楼主位】swanegong:
---------------------------------
先学会用STM32的串口再说.
另:stm32基本都用c语言的.不知楼主c语言如何...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-19 21:47:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
C语言一般

原子哥,上位机连续发送0xaa 0x01 0x04 0xaf 给STM32,中断一次还是四次啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-19 22:15:19 | 显示全部楼层
回复【3楼】swanegong:
---------------------------------
四次.如果设置了接收中断,每收到一个都会中断一次.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-19 23:31:17 | 显示全部楼层
谢谢原子哥的解答!!!



回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-19 23:33:40 | 显示全部楼层
 void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 data;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
//USART_ClearITPendingBit(USART1,  USART_IT_RXNE);
data=USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if(USART_RX_STA != 0x80)
{
if(USART_RX_STA==0x00)
{
uart_rxdata.preamble=data;
USART_RX_STA++;
//USART_RX_BUF[USART_RX_STA++]=data;
}
if(USART_RX_STA==0x01)
{
uart_rxdata.cmd=data;
USART_RX_STA++;
//USART_RX_BUF[USART_RX_STA++]=data;
}
if(USART_RX_STA==0x02)
{
uart_rxdata.length=data;
USART_RX_STA++;
//USART_RX_BUF[USART_RX_STA++]=data;
}  
if(USART_RX_STA==0x03)
{
uart_rxdata.crc=data;
//USART_RX_BUF[USART_RX_STA++]=data;
USART_RX_STA|=0x80;
}
}
}



main.c

while(1)
{
if(USART_RX_STA&0x80)
{    
/* len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
printf("");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);
while((USART1->SR&0X40)==0);//等待发送结束
}
printf("\n\n");//插入换行     */
USART_SendData(USART1,uart_rxdata.preamble);
delay_ms(100);
USART_SendData(USART1,uart_rxdata.cmd);
delay_ms(100);
USART_SendData(USART1,uart_rxdata.length);
delay_ms(100);
USART_SendData(USART1,uart_rxdata.crc);
delay_ms(100); 

USART_RX_STA=0;
}
else
{
times++;
if(times%5000==0)
{
//printf("\nMiniSTM32开发板 串口实验\n");
//printf("正点原子@ALIENTEK\n\n\n");
}
//if(times%200==0)printf("请\n");  
if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
delay_ms(10);   
}
}


我接收的四个字节怎么都是0xaa ? 中断函数哪里有错误吗?
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-19 23:37:59 | 显示全部楼层
晕哈,图片传不上去
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-20 08:25:11 | 显示全部楼层
我发送字节 0xaa 0xbb 0xcc 0xdd            STM32返回全是0xaa 0xaa 0xaa 0xaa
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2012-4-20 09:36:34 | 显示全部楼层
感谢原子哥,终于搞定了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-9-19
在线时间
1 小时
发表于 2014-9-19 15:52:56 | 显示全部楼层
楼主搞好了也不说怎么搞好的。不地道0.0
但是好像收数据的条件判断语句是有问题的。不存在逻辑先后关系的吗?
知识像是大海。
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
 楼主| 发表于 2014-9-22 12:50:23 | 显示全部楼层
回复【10楼】abandon:
---------------------------------
请参考

void USART1_IRQHandler(void)                
{
u8 data;
#ifdef OS_TICKS_PER_SEC   //?????±?????????¨????,???÷??????ucosII??.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
data=USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
USART_RX_BUF[USART_RX_STA]=data;
USART_RX_STA++;
}
if(USART_RX_STA==0x0004&&USART_RX_BUF[0]==0xaa&&USART_RX_BUF[2]==0x04)
{
uart_rxdata.preamble=USART_RX_BUF[0];
uart_rxdata.cmd=USART_RX_BUF[1];
uart_rxdata.length=USART_RX_BUF[2];
uart_rxdata.crc=USART_RX_BUF[3];
OSSemPost(Sem_Usart);
USART_RX_STA|=0x8000;
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
#ifdef OS_TICKS_PER_SEC   //?????±?????????¨????,???÷??????ucosII??.
OSIntExit();    
#endif
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 01:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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