PC端怎样通过串口接收单片机端发送过来的数据位为9bits的数据?

qgw_2000 2003-08-12 11:14:43
单片机(51)的串行口的工作方式2、3可以发送数据位为9bits的数据,其中第9位
由软件预先写在SCON寄存器的TB8位,接收到的第9位数据存放在SCON的RB8位。
PC端如何接收和发送数据位为9位的数据?大虾指教,谢了。

...全文
1168 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
winloop 2003-08-14
  • 打赏
  • 举报
回复
这个问题是这样的-----------------

1-首先我肯定(或者是假设)你是想用计算机作为单片机多机通信系统中的主机。
2-再一次假设你对单片机多机通信系统的机制是很熟悉的,我在这里再简单的描述一下:
单片机多机通信系统是依靠第9位来进行的,主机在发送地址字节时是必须将第9位置1的,发送
数据字节时必须将第9位置0。在单片机中有一个可编程的SM2位,当该位被置1时,单片机只能接
收第9位为1的数据;当该位被置0时,单片机均能接收第9位为0或1的数据。利用此特性,在多机
通信的开始时,主机将自己的SM2位置0,以保证能收到从机发来的任何9位数据,从机将自己的
SM2位置1,用以接收主机发来的寻址字节。假设在这个系统中有1个主机和32个从机,开始时所
有从机都在侦听主机发来的地址帧,假设主机想访问10号从机,那么主机首先将第9位(TB8位)
置1,然后把字节10发出;所有的从机这时候都能收到地址帧10,然后和自己的地址比较,当非
10号从机发现该地址帧不是呼叫自己时(与自己的地址不符)什么也不做继续等待接收地址帧,当
10号从机发现呼叫的是自己时则将SM2位置0以接收主机随后发来的所有9位数据,而在10号从机
接收后续第9位为0的数据字节时其他从机是收不到该数据字节的,这样在这一时刻就造成了主机
和10号从机“单独”通信的现像,依理而推主机与其他从机通信的过程也是一样的。
3-计算机做为单片机多机通信的主机是容易实现的。
首先肯定的一点是当计算机做为主机时也必须遵循同样的“游戏规则”才能顺利的完成多机通信
。计算机中的第9位总共可以被设置成5种状态,其状态的设置是在设备控制块(device control
block)DCB结构中设置的,分别如下:
DCB.Parity=NOPARITY; //无校验
DCB.Parity=ODDPARITY; //奇校验
DCB.Parity=EVENPARITY; //偶校验
DCB.Parity=MARKPARITY; //校验置位(第9位置1)
DCB.Parity=SPACEPARITY; //校验清零(第9位置0)
当计算机发地址帧时,就要先将第九位置1,DCB.Parity=MARKPARITY;
当计算机发数据帧时,就要先将第九位置0,DCB.Parity=SPACEPARITY;
当发完所有的地址帧和数据帧后,因为当前串口所处的模式就是9位模式,所以能接收到从机发
来的的所有9位数据。

设置第9位数据的函数用C++ BUILDER描述如下(hComm是已获得的串口句柄):
bool TSerialPort::ConfigVerifyMode(BYTE cParity){
DCB ComDCB;

if(cParity<=4){
if(hComm==INVALID_HANDLE_VALUE){
Application->MessageBox("串口句柄无效,无法进行参数配置!","错误",MB_ICONSTOP);
return false;
}
if(GetCommState(hComm,&ComDCB)){
ComDCB.Parity=cParity;
if(SetCommState(hComm,&ComDCB)){return true;}
else{
Application->MessageBox("配置串口校验方式时发生错误!","错误",MB_ICONSTOP);
return false;
}
}
else{ProcessErrorMessage("获取串口状态");return false;}
}
else{
Application->MessageBox("配置串口校验方式时发生参数传递错误!参数范围:0~4!","错误",MB_ICONSTOP);
return false;
}
}
呵呵,值不值一百分呀:)
binglin 2003-08-14
  • 打赏
  • 举报
回复
可以呀,它本来就是用来作校验位嘛。
qgw_2000 2003-08-14
  • 打赏
  • 举报
回复
winloop() 兄所言正合偶意,偶心中豁然开朗,一百分全归你了。
gcai 2003-08-14
  • 打赏
  • 举报
回复
能不能当校验位来收?
fooxu 2003-08-13
  • 打赏
  • 举报
回复
分2次发
woshixuchang 2003-08-13
  • 打赏
  • 举报
回复
gz
qgw_2000 2003-08-13
  • 打赏
  • 举报
回复
PC端是不是不能收发啊?

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧