一个串口通讯的简单问题
小弟对C++Builder在串口方面的应用不慎了解,请各位大虾帮忙。
我接触了一个仪表与计算机通讯的问题,仪表需要用RS232串口与计算机相连,计算机每发一条指令,仪表回复一条信息,其读指令的格式为:仪表地址+'82'+参数代号+0+0+效验和(其中仪表地址两个字符,参数代号一个字符,校验和两个字符,共八个字符)。串口的通讯协议为8位数据位,2位停止位,无效验位。
请问这里的数据位和停止位(一共是10位)与计算机发送的指令的位数有没有关系?计算机的指令是由字符串数组成还是由位数组组成?指令里的校验和同通讯协议的校验位有没有关系?
问题点数:20、回复次数:9Top
1 楼fidt982(痴心绝对~0~)回复于 2005-05-12 19:56:11 得分 0
你只需设置你和仪表通迅部分的格式,
什么停止位校验位,串口自己负责Top
2 楼cb2005(cb)回复于 2005-05-13 09:07:25 得分 0
偶也是刚弄、这个,以后多关照..
我用的是char[]做的.收时也是这样.Top
3 楼cczlp(不惑)回复于 2005-05-13 10:36:10 得分 5
请问这里的数据位和停止位(一共是10位)与计算机发送的指令的位数有没有关系?
===========================================================================
停止位是自动添加的,你不需要理会. 数据位是8位,可以正确发送字节数据,如果串口数据位小于8,
则只发送从低到高发送指定位数,如串口数据位7,则你要发送数据的最高一位丢失.
计算机的指令是由字符串数组成还是由位数组组成?
================================================
不太明白你的意思. 计算机最后发送的都是0~255的ASCii ,硬件转化为高低电平.
指令里的校验和同通讯协议的校验位有没有关系?
============================================
没有
Top
4 楼jandger(壮壮)回复于 2005-05-13 10:47:39 得分 0
如何设置串口通讯的数据位,停止位?
我想设置为8位数据位,2位停止位。
用GetCommState(hComm,&dcb);
dcb.ByteSize=?
dcb.StopBits=?;Top
5 楼wilsonloveada(ada是MM)回复于 2005-05-13 11:14:39 得分 0
你用Pcomm试试,特别好用!Top
6 楼jandger(壮壮)回复于 2005-05-13 13:52:40 得分 0
Pcomm是什么呀,是C++Builder里的控件还是其他的什么软件?Top
7 楼leonatcs(LeonKennedy)(时常逛一逛csdn,有益身心健康。)回复于 2005-05-13 15:30:11 得分 5
串口编程的四种方法
1.使用win32API函数 同步读写的例子如下:
//Open ComPort -------Sync(namely nonoverlaped)
HANDLE hCom;
hCom = CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE,0,0,
OPEN_EXISTING,0,0);
if (hCom == INVALID_HANDLE_VALUE) return;
//Set DCB
TDCB dcb1;
GetCommState(hCom,&dcb1);
dcb1.BaudRate = 9600;
//and other settings...
SetCommState(hCom,&dcb1);
//Write to comport -------Sync(namely nonoverlaped)
unsigned long k = 0; // use by WriteFile/ReadFile function to return how many bytes are written/read.
char charY = 'Y'; //char to send/receive
WriteFile(hCom, &charY, sizeof(char), &k, NULL);
//Sleep(2000);
//Read from comport -------Sync(namely nonoverlaped)
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
k = 0;
if( ComStat.cbInQue > 0) //cbInQue是输入队列的长度。
ReadFile(hCom, &charY, sizeof(char), &k, NULL);
if (k) Null;//something been read into tempchar
else GetLastError();
//Close Comport
CloseHandle(hCom);
// 几个易混的数据结构
// TCommProp 通信接口的属性,定义了接口的能力,如最大波特率,通信设备类型。
// COMSTATE 串口的通信状态,例如是否在等待CTS信号,输入输出队列是否有数据。
// TDCB 串口的设备控制块,定义串口通信时使用的波特率,停止位,校验方法等。
Top
8 楼leonatcs(LeonKennedy)(时常逛一逛csdn,有益身心健康。)回复于 2005-05-13 15:31:14 得分 5
2.使用控件:
BCB:
TComThread (http://www.mwowm.com/comthread/)
comm32bcb.zip
VictorComm
Delphi:
Spcomm
Both:
TurboPower Async Professional (Apro) 功能最为复杂和强大
Dejan Crnila's ComPort
VC:
Zcommex
ActiveX:
MSComm32.ocx 简单,常用
3.嵌入汇编。
4.VxD
Top
9 楼leonatcs(LeonKennedy)(时常逛一逛csdn,有益身心健康。)回复于 2005-05-13 15:36:19 得分 5
上面说的控件网上都有的下,随便搜搜就可以。
具体可以参见下面这些书:(我就看的第一本:))
http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS004952
http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS0022958
http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS001037Top




