c++怎样向串口发送第九位数据

时间:2022-11-25 07:58:14
一般情况是这样发送
char buf[2] = {0xa8,0x88};
DWORD dw;
WriteFile( m_hMyCom, buf, 2, &dw, NULL ) );
但这都是发送了8位,怎样发送第9位呢?
各们大侠,我在线等,帮忙弄好了还会加分,谢谢!!

网上很多人说,第9位是校验位的,第九位是地址标识位,1代表是地址,0代表数据,
但我用SetCommState来设置0、1,但还是不行

//设置串口参数:波特率,停止位,等
bool SetState(DWORD dwBaudRate, DWORD dwByteSize = 8, DWORD dwParity = NOPARITY, DWORD dwStopBits = ONESTOPBIT)
                                    static unsigned int k = 0;
BYTE wBuf[1];
memset(wBuf,'\0',1);


switch(k)
{
case 0:
wBuf[0]= 0x88;
if (wBuf[0]==0x88)
{
std::cout<<"gggggggggggg"<<std::endl;
}
//wBuf[1] = 0x01;
m_port.SetState(4800,8,0,1);
m_port.Write(wBuf,1);
k ++;
break;
case 1:
wBuf[0] = 0x88;
//wBuf[1] = 0x00;
m_port.SetState(4800,8,1,1);
m_port.Write(wBuf,1);
k ++;
break;
}

21 个解决方案

#1


你都发了16位了啊。

#2


WriteFile的确是按直接写的,但是你写入的会以比特流的方式发送。
所以第九位就是第二个字节的最高位。

#3


一个byte一个byte的发送不就完了吗?
有那么多讲究么?
那就自己定义一个规则:第三个byte作为前两个byte的标志。

#4


在超级终端中你可以设定发送数据的格式,例如我们一般用 8-N-1(8-bit,无效验,一个停止位)

在单片机中有另外一个指定的 register 中的某一位是第九位,有专门的发送指令步骤

在vs2010-->串口-->属性-->databit 可以设定位数

#5


数据位最大是8,我觉得一次发不了9位数据

#6


引用 2 楼 bokutake 的回复:
WriteFile的确是按直接写的,但是你写入的会以比特流的方式发送。
所以第九位就是第二个字节的最高位。

什么意思,不是很清楚

#7


引用 3 楼 loaden 的回复:
一个byte一个byte的发送不就完了吗?
有那么多讲究么?
那就自己定义一个规则:第三个byte作为前两个byte的标志。

我也是一个字节一个字节的发,不过一个字节就是8位啊,现在要求含有第九位发,
串口数据格式:
起始位,数据位(5—10位)常用8位,校验位,停止位。。。。但我就是不知道9或10位怎么发

#8


通过校验位来设置第九位,如果是windows得调用设置校验规则的API

#9


楼上正解

#11


引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?

#12


引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?

SetCommState
在DCB参数中改Parity
这个第九位是上位机和单片机串口通讯尤其是485中经常用到的。

#13


发1还0啊

#14


引用 12 楼 lhylhy 的回复:
引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?
……

我用的是51的板哦,它的通信协义要求:(pc机每接收到一位,都要带第9位原原本本的发回去)
开机过程==================================
88 //联络
88 35 01 80  //第1轮
88 33 01 80  //第1回
88 37 00 31 00 80  //
88 51 00 00 00 80  //送1
88 52 00 00 00 80  //送2
88 53 00 00 00 80  //送3
88 54 00 00 00 80  //送4
88 55 00 00 00 80  //送5
88 32 02 80  //
88 33 02 80  //第2回
88 37 00 59 00 80  //同上.....
88 51 00 00 00 80  //
88 52 00 00 00 80  //
88 53 00 00 00 80  //
88 54 00 00 00 80  //
88 55 00 00 00 80  //
88 32 03 80  //
88 33 03 80  //

#15


这个是一对一发送的
收到88就返回88,但我接受不到它发过来的第9位数据

#16


引用 14 楼 qq395280705 的回复:
引用 12 楼 lhylhy 的回复:
引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了……

你咋接受的第九位?
Windows下发送第九位简单,接收似乎没啥可行的方法。
我很好奇。

#17


一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

#18


引用 17 楼 lhylhy 的回复:
一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

那PC机要设置为1发送回去吗?

#19


引用 18 楼 qq395280705 的回复:
引用 17 楼 lhylhy 的回复:
一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

那PC机要设置为1发送回去吗?

为啥要发送回去?
单片机要对发送回去的数据做什么处理吗?
这些处理有什么重要意义吗?
我不建议这么制定协议。

#20


我不懂单片机的,他提供协议给我,我的软件要和那板进行交互的,相互通讯才可以

#1


你都发了16位了啊。

#2


WriteFile的确是按直接写的,但是你写入的会以比特流的方式发送。
所以第九位就是第二个字节的最高位。

#3


一个byte一个byte的发送不就完了吗?
有那么多讲究么?
那就自己定义一个规则:第三个byte作为前两个byte的标志。

#4


在超级终端中你可以设定发送数据的格式,例如我们一般用 8-N-1(8-bit,无效验,一个停止位)

在单片机中有另外一个指定的 register 中的某一位是第九位,有专门的发送指令步骤

在vs2010-->串口-->属性-->databit 可以设定位数

#5


数据位最大是8,我觉得一次发不了9位数据

#6


引用 2 楼 bokutake 的回复:
WriteFile的确是按直接写的,但是你写入的会以比特流的方式发送。
所以第九位就是第二个字节的最高位。

什么意思,不是很清楚

#7


引用 3 楼 loaden 的回复:
一个byte一个byte的发送不就完了吗?
有那么多讲究么?
那就自己定义一个规则:第三个byte作为前两个byte的标志。

我也是一个字节一个字节的发,不过一个字节就是8位啊,现在要求含有第九位发,
串口数据格式:
起始位,数据位(5—10位)常用8位,校验位,停止位。。。。但我就是不知道9或10位怎么发

#8


通过校验位来设置第九位,如果是windows得调用设置校验规则的API

#9


楼上正解

#10


#11


引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?

#12


引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?

SetCommState
在DCB参数中改Parity
这个第九位是上位机和单片机串口通讯尤其是485中经常用到的。

#13


发1还0啊

#14


引用 12 楼 lhylhy 的回复:
引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了校验位了呢,调试时候还是初始化的那个?
……

我用的是51的板哦,它的通信协义要求:(pc机每接收到一位,都要带第9位原原本本的发回去)
开机过程==================================
88 //联络
88 35 01 80  //第1轮
88 33 01 80  //第1回
88 37 00 31 00 80  //
88 51 00 00 00 80  //送1
88 52 00 00 00 80  //送2
88 53 00 00 00 80  //送3
88 54 00 00 00 80  //送4
88 55 00 00 00 80  //送5
88 32 02 80  //
88 33 02 80  //第2回
88 37 00 59 00 80  //同上.....
88 51 00 00 00 80  //
88 52 00 00 00 80  //
88 53 00 00 00 80  //
88 54 00 00 00 80  //
88 55 00 00 00 80  //
88 32 03 80  //
88 33 03 80  //

#15


这个是一对一发送的
收到88就返回88,但我接受不到它发过来的第9位数据

#16


引用 14 楼 qq395280705 的回复:
引用 12 楼 lhylhy 的回复:
引用 11 楼 qq395280705 的回复:
引用 8 楼 lhylhy 的回复:
通过校验位来设置第九位,如果是windows得调用设置校验规则的API

怎么设置设置校验呢,你之前也遇到这种情况嘛?一开始打开串口的时候设置校验是什么,是NOPARITY吗,还是MARKPARITY或SPACEPARITY呢?为什么我打开了串口后就再也设置不了……

你咋接受的第九位?
Windows下发送第九位简单,接收似乎没啥可行的方法。
我很好奇。

#17


一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

#18


引用 17 楼 lhylhy 的回复:
一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

那PC机要设置为1发送回去吗?

#19


引用 18 楼 qq395280705 的回复:
引用 17 楼 lhylhy 的回复:
一般来说协议都是这么定的:
只许上位机发送地址查找单片机,单片机只许响应上位机,不许主动通讯。
上位机决定和哪个单片机通讯,所以不需要查询地址,所以单片机应答时第九位都置0。

那PC机要设置为1发送回去吗?

为啥要发送回去?
单片机要对发送回去的数据做什么处理吗?
这些处理有什么重要意义吗?
我不建议这么制定协议。

#20


我不懂单片机的,他提供协议给我,我的软件要和那板进行交互的,相互通讯才可以

#21