OpenEdv-开源电子网

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

两单片机的串口通信问题

[复制链接]

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-3-13
在线时间
14 小时
发表于 2016-5-28 19:58:11 | 显示全部楼层 |阅读模式
5金钱
模仿匿名的上位机传输方式发送板
[mw_shl_code=c,true]void usart1_send_char(u8 c)
{
USART_SendData(USART1,c);        
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
         
}
//传送数据给匿名四轴上位机软件(V2.6版本)
//fun:功能字. 0XA0~0XAF
//data:数据缓存区,最多28字节!!
//len:data区有效数据个数
void usart1_niming_report(u8 fun,u8*data,u8 len)
{
        u8 send_buf[32];
        u8 i;
        if(len>28)return;        //最多28字节数据
        send_buf[len+3]=0;        //校验数置零
        send_buf[0]=0X88;        //帧头
        send_buf[1]=fun;        //功能字
        send_buf[2]=len;        //数据长度
        for(i=0;i<len;i++)send_buf[3+i]=data;                        //复制数据
        for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf;        //计算校验和       
        for(i=0;i<len+4;i++)usart1_send_char(send_buf);        //发送数据到串口1
}
//发送加速度传感器数据和陀螺仪数据
//aacx,aacy,aacz:x,y,z三个方向上面的加速度值
//gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
void position_send_data(short x,short y,short mode)
{
        u8 tbuf[6];
        tbuf[0]=(x>>8)&0XFF;
        tbuf[1]=x&0XFF;
        tbuf[2]=(y>>8)&0XFF;
        tbuf[3]=y&0XFF;
        tbuf[4]=(mode>>8)&0XFF;
        tbuf[5]=mode&0XFF;

        usart1_niming_report(0XA1,tbuf,6);//自定义帧,0XA1
}       
[/mw_shl_code]
发送可以,
接收的板子却怎么也接收不到想了好久一直不行,求助大家了
[mw_shl_code=c,true]void RC_solve(void)
{  
         u8 sum = 0;
          u8 i=0;
        for(;i<31;i++)
                {
                        cmd[i++]=USART_ReceiveData(USART1);
                        sum += USART_ReceiveData(USART1);
                }
        if(!(sum==cmd[31]))                return;                //判断sum
        if(!(cmd[0]==0x88))                return;                //判断帧头
        if(cmd[1]==0xA1)                                                                //判断功能字,=0xA1,为接收数据
        {
                RC_x = (vs16)(cmd[3]<<8)|cmd[4];
                RC_y= (vs16)(cmd[5]<<8)|cmd[6];
                aa        = (vs16)(cmd[7]<<8)|cmd[8];
        }
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

八成是配置不对啊,先搞出来发送1个字节,一个字节发送成功了,剩下的就简单了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-5-28 19:58:12 | 显示全部楼层
八成是配置不对啊,先搞出来发送1个字节,一个字节发送成功了,剩下的就简单了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-5-29 14:46:08 | 显示全部楼层

cmd[i++]=USART_ReceiveData(USART1);
sum += USART_ReceiveData(USART1);
这两句是不是一次收了两个字节,而把一个存放到cmd数组中,导致校验和计算错误?其实cmd中保存的已经不是玩完整的数据帧了!
回复

使用道具 举报

5

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-5-29
在线时间
5 小时
发表于 2016-5-29 17:23:10 | 显示全部楼层
看硬件配置对不对
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-3-13
在线时间
14 小时
 楼主| 发表于 2016-5-31 12:16:48 | 显示全部楼层
mcudiy 发表于 2016-5-29 14:46
cmd=USART_ReceiveData(USART1);
sum += USART_ReceiveData(USART1);
这两句是不是一次收了两个字节, ...

不是這個原因,我把後面的去掉,還是不行
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-5-31 13:14:07 | 显示全部楼层
jiayoua 发表于 2016-5-31 12:16
不是這個原因,我把後面的去掉,還是不行

你把后面的去掉了校验和计算就不对了,先用一个变量后串口数据,再进行后面的两步操作或者教研和计算从接受缓存区里面读取数据,如果还不行就不知道了。
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-5-31 13:15:05 | 显示全部楼层
上面有点错误:先用一个变量接收串口数据
回复

使用道具 举报

4

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
622
金钱
622
注册时间
2016-5-11
在线时间
40 小时
发表于 2016-5-31 13:43:36 | 显示全部楼层
建议:
1. 调用USART_ReceiveData接收之前先判断一下接收标志位RXNE标志位,确定是否接收到数据,你不判断如果数据还未到时就执行了For循环,肯定收不到数据;
2. 其次,你不能连续调用函数USART_ReceiveData两次,一次作为数据,一次做校验,两次的数据应该是不一样的;
3. 再次,接收不到数据还得看你的底层配置是否正确,即使配置正确,根据第一点也可能接收不到数据;
4. 确认总线上是否有数据;
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-3-13
在线时间
14 小时
 楼主| 发表于 2016-5-31 19:20:29 | 显示全部楼层
aisini 发表于 2016-5-31 13:43
建议:
1. 调用USART_ReceiveData接收之前先判断一下接收标志位RXNE标志位,确定是否接收到数据,你不判断 ...

發現還是不可以,現在換了個簡單的串口程序,已經可以用,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 11:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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