论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-4-14 00:36:52
|
显示全部楼层
本帖最后由 likunxue 于 2016-4-14 04:36 编辑
没有哪么简单, 这个要上位机与单片机之前的数据定义要一样, 取结构体数据的首地址,强制转化为8位的的数据指针, 算出要发送的结构体大小, 然后从头到尾发出去, 上位机收到数据后,将接收缓存区数组的首地强制转化为结构体指针, 然后按结构体的数据格式读出来!
比如要发送以下数据
typedef struct
{
u32 ZUOBIAO; //坐标
u8 BIANHAO; //电机编号
u8 BIAOZHI; //校验码
}DIANJIZUOBIAO; //串口电机坐标数据结构
发送程序
/************************************************************************************
函数名: 发送工作坐标
调 用: RX_BMB(u8 rr1,u32 Dat)
参 数: rr1 驱动器编号
返回值:
************************************************************************************/
void RX_BMB(u8 rr1,u32 Dat)
{
const int SIZE = sizeof(DIANJIZUOBIAO); //得要转送数据的大小
DIANJIZUOBIAO BM; //定义一个串口电机参数数据结构
u8 *Bu = (u8*)&BM; //定义一个8位的指针,首地址指向 BM;
u8 Byte,K,i;
BM.ZUOBIAO = Dat; //装入坐标
BM.BIANHAO = rr1; //装入电机编号
BM.BIAOZHI = 0xe5; //装入校验码
SUA_ShiYongQuan(); //申请485总线使用权
for(i = 0; i< SIZE; i++)
{
Byte = Bu; //取得要发送的数据
while((USART2->SR & 0x80)==0); //等待发送区空
USART2->DR = Byte & 0x7f; //发送低7位
if(i == 0)K = ((Byte >> 7) & 0x07)|SUA_CLRINT; //初始化指令
else{
K = ((Byte >> 7) & 0x07)|SUA_QIEMIANCANSHU; //数据码
}
while((USART2->SR & 0x80)==0); //等待发送区空
USART2->DR = K; //发送高3位与指令码
}
while((USART2->SR & 0x40)==0); //等待发送结束
OSMutexPost(sem_SUA); //释放485使用权
}
接收处理
DIANJIZUOBIAO *const P = (DIANJIZUOBIAO *)RX_Buf; //这里将接收缓存区数组首地址强制转化为数据结构体指针
if((P->BIAOZHI == 0xe5)&&(P->BIANHAO == SYS_QDQBH)) //数据接收正确
{
MoB.ZhiDingZuoBiao= P->ZUOBIAO;//坐标直接写入
MoB.SuDu = 100;
SYS_CSPZBZJCQ |= 0x40;
}
|
|