OpenEdv-开源电子网

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

有关串口通信协议问题

[复制链接]

48

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-4-23
在线时间
166 小时
发表于 2013-5-27 15:35:52 | 显示全部楼层 |阅读模式
没做过这方面的处理,所以问的问题可能不是很清晰,望见谅。现在问题是这样的,通信用的是普通的UART串口通信(1个起始位+8个数据位+1个停止位),一帧数据包括 地址(1字节)、命令(2)、数据(5)、校验(1)
命令里又有许多的不同命令,状态数据里也又不同数据需要发送。从软件的角度看有没有什么办法能让这些数据的发送操作来的简单点。我本来是这样定义的
//1.特殊字符说明
#define STX 0XFF //命令开始,同步字符
#define ACK 0XA6 //成功返回
//2.命令(2字节)汇总
__IO uint8_t ZT[2]={0X5A,0X54};
__IO uint8_t SJ[2]={0X53,0X4A};
__IO uint8_t CJ[2]={0X43,0X4C};
__IO uint8_t CF[2]={0X31,0X3A};
__IO uint8_t NDC[2]={0X37,0X53};
__IO uint8_t NDY[2]={0X23,0X4C};
//3.状态发送数据说明
__IO uint8_t RUN[5]={0X00,0X00,0X52,0X55,0X4E};
__IO uint8_t STOP[5]={0X00,0X53,0X54,0X4F,0X50};
__IO uint8_t START[5]={0X53,0X54,0X41,0X52,0X54};
__IO uint8_t CLCLR[5]={0X23,0X4C,0X43,0X2C,0X52};
比如我要发送ZT那就依次取数组ZT[2]中的数发送。没有更好的办法,不知道有木有描述清楚。





努力做,耐心等
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-5-28 00:05:15 | 显示全部楼层
你这很像modbus协议啊...
这个整个协议传输就可以了.
封装成函数是个好办法,你这样不可取.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

48

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-4-23
在线时间
166 小时
 楼主| 发表于 2013-5-28 09:19:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
封装成函数?是把指令封装成函数?还是。能举个例子不,原子哥。
努力做,耐心等
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-5-28 10:15:31 | 显示全部楼层
不是很简单么?
比如我们的CAN例程的发送函数:
//id:标准ID(11位)/扩展ID(11位+18位)     
//ide:0,标准帧;1,扩展帧
//rtr:0,数据帧;1,远程帧
//len:要发送的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节)
//*dat:数据指针.
//返回值:0~3,邮箱编号.0XFF,无有效邮箱.
u8 Can_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat)
{    
u8 mbox;   
if(CAN->TSR&(1<<26))mbox=0; //邮箱0为空
else if(CAN->TSR&(1<<27))mbox=1; //邮箱1为空
else if(CAN->TSR&(1<<28))mbox=2; //邮箱2为空
else return 0XFF; //无空邮箱,无法发送 
CAN->sTxMailBox[mbox].TIR=0; //清除之前的设置
if(ide==0) //标准帧
{
id&=0x7ff;//取低11位stdid
id<<=21;   
}else //扩展帧
{
id&=0X1FFFFFFF;//取低32位extid
id<<=3;    
}
CAN->sTxMailBox[mbox].TIR|=id;  
CAN->sTxMailBox[mbox].TIR|=ide<<2;   
CAN->sTxMailBox[mbox].TIR|=rtr<<1;
len&=0X0F;//得到低四位
CAN->sTxMailBox[mbox].TDTR&=~(0X0000000F);
CAN->sTxMailBox[mbox].TDTR|=len;    //设置DLC.
//待发送数据存入邮箱.
CAN->sTxMailBox[mbox].TDHR=(((u32)dat[7]<<24)|
((u32)dat[6]<<16)|
  ((u32)dat[5]<<8)|
((u32)dat[4]));
CAN->sTxMailBox[mbox].TDLR=(((u32)dat[3]<<24)|
((u32)dat[2]<<16)|
  ((u32)dat[1]<<8)|
((u32)dat[0]));
CAN->sTxMailBox[mbox].TIR|=1<<0; //请求发送邮箱数据
return mbox;
}
也有一堆的东西,直接作为参数传递不就完事了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

48

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-4-23
在线时间
166 小时
 楼主| 发表于 2013-5-28 10:21:18 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哦,这个我也是这么干的啊。OK,多谢原子哥。
努力做,耐心等
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-5-28 11:38:22 | 显示全部楼层
地址(1字节)、命令(2)、数据(5)、校验(1)

typedef struct {
 u8 addr;
 u16 cmd;
 u8 data[5];
 u8 jdy;
}MsgType;

这样再操作
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-19 19:22:46 | 显示全部楼层
回复【6楼】aleda303:
---------------------------------
这种数据结构是不是为了取数据的时候解包的
合肥-文盲
回复 支持 反对

使用道具 举报

23

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2015-7-1
在线时间
2 小时
发表于 2015-10-29 17:31:30 | 显示全部楼层
回复【6楼】aleda303:
---------------------------------
这个接收数据的时候怎么处理呢?
回复 支持 反对

使用道具 举报

12

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-4-23
在线时间
21 小时
发表于 2016-10-24 11:24:56 | 显示全部楼层
正点原子 发表于 2013-5-28 10:15
不是很简单么?
比如我们的CAN例程的发送函数:
//id:标准ID(11位)/扩展ID(11位+18位)        &nbsp;&nbsp;&nbsp;&nb ...

原子哥,能给一个实现串口协议的例子来参考一下吗?突然接到这样的任务,以前都没有接触过协议这一方面的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 05:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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