OpenEdv-开源电子网

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

又来求助了,根据通信协议编程(STM32F407)

[复制链接]

17

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2016-8-8
在线时间
362 小时
发表于 2016-9-6 16:54:28 | 显示全部楼层 |阅读模式
10金钱
帧头
控制字
数据
校验
帧尾
0xAA
0x83
5个字节
异或校验
0x55
这个是我自己定的协议,通信方面一窍不通,照着历程改了改程序也走不通,求大神指导
附上我丑陋的代码:
void USART1_IRQHandler(void)
{
        u8 res;
        USART_RX_BUF[0]=0xAA;//帧头
        USART_RX_BUF[1]=0x83;//控制字
        if(USART1->SR&(1<<5))//接收到数据
        {
                res=USART1->DR;
                if(USART_RX_CNT<7)
                {
                        USART_RX_BUF[USART_RX_CNT]=res;
                        USART_RX_CNT++;
                }       
        }
        USART_RX_BUF[7]=xor_dat(USART_RX_BUF,9);//校验
        USART_RX_BUF[8]=0x55;//帧尾
}

unsigned char xor_dat(unsigned char *d,int num)//计算异或校验
{
        unsigned char res=0;
        int n;
        for(n=0;n<num;n++)
                {
                 res^=d[n];
        }
            return res;
}

主程序是这么改的:
while(1)
{                       
if(USART_RX_CNT==7)
{
        printf("\r\n你发送的消息为:\r\n");
        for(t=0;t<9;t++)
        {
                USART1->DR=USART_RX_BUF[t];
                while((USART1->SR&0x40)==0);
        }
}

}
USART_RX_CNT是我定义的,初值为2,因为协议里数据是五个字节。
程序要是还能改求大神指导啊!!!

最佳答案

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

整出来了,我太菜了,改成16进制发送就没问题了,谢谢
黑夜给了我黑色的眼睛,我却用它来寻找白花花的银子,黄灿灿的金子,以及红彤彤的毛爷爷
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2016-8-8
在线时间
362 小时
 楼主| 发表于 2016-9-6 16:54:29 | 显示全部楼层
Da Wen 发表于 2016-9-7 08:29
要异或应该也是校验码之前那些数去异或,不应该9个都异或

整出来了,我太菜了,改成16进制发送就没问题了,谢谢
黑夜给了我黑色的眼睛,我却用它来寻找白花花的银子,黄灿灿的金子,以及红彤彤的毛爷爷
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-9-6 17:12:25 | 显示全部楼层
xor_dat(USART_RX_BUF,9);//校验
这里为什么是9?
原谅我不清楚你的程序走不通是什么走不通
回复

使用道具 举报

17

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2016-8-8
在线时间
362 小时
 楼主| 发表于 2016-9-7 08:05:29 | 显示全部楼层
Da Wen 发表于 2016-9-6 17:12
xor_dat(USART_RX_BUF,9);//校验
这里为什么是9?
原谅我不清楚你的程序走不通是什么走不通

就是异或校验,把数组里的数都异或校验了,一共9个,程序编译什么的都没问题,就是不停输出“你发送的消息为:”,发回来的数都是乱码,大神能根据协议给修改下程序吗,不胜感激
黑夜给了我黑色的眼睛,我却用它来寻找白花花的银子,黄灿灿的金子,以及红彤彤的毛爷爷
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-9-7 08:29:52 | 显示全部楼层
守候ocean 发表于 2016-9-7 08:05
就是异或校验,把数组里的数都异或校验了,一共9个,程序编译什么的都没问题,就是不停输出“你发送的消 ...

要异或应该也是校验码之前那些数去异或,不应该9个都异或
回复

使用道具 举报

3

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
973
金钱
973
注册时间
2012-5-8
在线时间
346 小时
发表于 2016-9-7 08:31:06 | 显示全部楼层
协议一般应该是最后才是校验码。你自己看看程序,异或校验包括帧尾吗
回复

使用道具 举报

17

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2016-8-8
在线时间
362 小时
 楼主| 发表于 2016-9-8 08:24:44 | 显示全部楼层
mmlyy2012 发表于 2016-9-7 08:31
协议一般应该是最后才是校验码。你自己看看程序,异或校验包括帧尾吗

多谢指导!
黑夜给了我黑色的眼睛,我却用它来寻找白花花的银子,黄灿灿的金子,以及红彤彤的毛爷爷
回复

使用道具 举报

17

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2085
金钱
2085
注册时间
2016-8-8
在线时间
362 小时
 楼主| 发表于 2016-9-8 08:27:40 | 显示全部楼层
Da Wen 发表于 2016-9-7 08:29
要异或应该也是校验码之前那些数去异或,不应该9个都异或

眼花了,sorry,没把最佳答案设置给你
黑夜给了我黑色的眼睛,我却用它来寻找白花花的银子,黄灿灿的金子,以及红彤彤的毛爷爷
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-9-8 08:38:51 | 显示全部楼层
守候ocean 发表于 2016-9-8 08:27
眼花了,sorry,没把最佳答案设置给你

解决了就行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 12:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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