社区
单片机/工控
帖子详情
PC端怎样通过串口接收单片机端发送过来的数据位为9bits的数据?
qgw_2000
2003-08-12 11:14:43
单片机(51)的串行口的工作方式2、3可以发送数据位为9bits的数据,其中第9位
由软件预先写在SCON寄存器的TB8位,接收到的第9位数据存放在SCON的RB8位。
PC端如何接收和发送数据位为9位的数据?大虾指教,谢了。
...全文
1168
7
打赏
收藏
PC端怎样通过串口接收单片机端发送过来的数据位为9bits的数据?
单片机(51)的串行口的工作方式2、3可以发送数据位为9bits的数据,其中第9位 由软件预先写在SCON寄存器的TB8位,接收到的第9位数据存放在SCON的RB8位。 PC端如何接收和发送数据位为9位的数据?大虾指教,谢了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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端是不是不能收发啊?
17
串口接收
试验_51
单片机
串口接收
数据
实验_
51
单片机
串口接收
实验,简单易懂的接收程序
PC机与
单片机
串口通信
PC机
单片机
串口通信 VB MSComm控件
48
单片机
与PC机串口通讯仿真_51
单片机
_sheeplmk_
MCU and PC serial communication simulation
与51
单片机
实现串口通讯,采集
数据
,实现PC通讯,显示和
发送
数据
.zip
与51
单片机
实现串口通讯,采集
数据
,实现PC通讯,显示和
发送
数据
.zip
51
单片机
串口通信(上位机接收
单片机
数据
)
自己编的,不过格式还是算规范的吧,单独建了个.C的文件,专门用于模块程序的放置,这样以后好调用些,希望对大家有用
单片机/工控
27,508
社区成员
28,796
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章