串口通信调试助手设计.docx
- 文档编号:29646424
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:14
- 大小:42.86KB
串口通信调试助手设计.docx
《串口通信调试助手设计.docx》由会员分享,可在线阅读,更多相关《串口通信调试助手设计.docx(14页珍藏版)》请在冰豆网上搜索。
串口通信调试助手设计
串口通信调试助手设计
学生:
(宋体五号居中)
指导教师:
(宋体五号居中)
(楷体五号居中)
1发展历史和由来
串口的出现是在1980年前后,数据传输率是115kbps~230kbps。
串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。
串口也可以应用于两台计算机(或设备)之间的互联及数据传输。
由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已开始取消该接口。
目前串口多用于工控和测量设备以及部分通信设备中。
2串口通信划分种类
串口通信的两种最基本的方式:
同步串行通信方式和异步串行通信方式。
同步串行是指SPI(SerialPeripheralinterface)的缩写,顾名思义就是串行外围设备接口。
SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,TRM450是SPI接口。
异步串行是指UART(UniversalAsynchronousReceiver/Transmitter),通用异步接收/发送。
UART是一个并行输入成为串行输出的芯片,通常集成在主板上。
UART包含TTL电平的串口和RS232电平的串口。
TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDSSD4、EL805等是RS232接口,EL806有TTL接口。
串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。
RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。
3各类串口协议简介
3.1各类串口的比较
从其发展历史、各自特点来介绍各种协议,RS232和RS485的区别和接法。
首先是发展历史。
最开始出现的串口通信协议是RS232,1962年发布的。
由于其传输速度、单向传递、传输距离短等多方面的制约,因此使用受到限制。
于是人们在RS232的基础上做了相应的改进,提高了相应的传输速度、传输距离,于是出现了RS422的雏形,并在工业上得到了相应的应用。
但由于任然是单向传输的,使构成的网络只能是单向的。
既只能是主机给从机发送指令或数据,从机只能接受并处理相应的消息,不能反映相应的结果。
于是人们又做了相应的调整。
最后于1983年发布了RS485通信协议。
正如前面所说的。
RS232协议是一种简单的串口通信协议,也是最基本的。
一般用在实验室等短距离、对传输速度等要求不高的场合,并且与TTL电平不兼容。
RS422有了相应的提高。
是一种单机发送,多机接收的平衡通信协议接口,传输速度最高可以达到10Mbps,传输距离最远可达到4000英尺,并且在这条平衡总线上能最多带10个从机,但是任然是单向的传输。
RS485是一种多点,双向通信的平衡通信协议接口。
再RS422的基础上增加了网络中接点(多机)的数量和双向通信能力,同时还增加了驱动器的传输能力和冲突保护特性,扩展了总线共模范围。
传输速度最高可以达到10Mbps,标准距离可以达到4000英尺,实际能达到3000米,并且在这条线上最多可以带128个收发器。
RS232和RS485的区别:
1.传输速度不同。
RS485可以达到10Mbps,高于RS232的速度。
2.电气特性不同。
RS485采用的是平衡驱动器和差分接收器的组合。
RS485是输出的是差分信号,抗共模干扰能力强。
逻辑“1”是两输出信号的+(2~6)V,“0”是-(2~6)V表示。
电气信号低于RS232的电气信号,不容易损坏接口芯片,并且与TTL电平兼容。
3.传输距离不同。
RS485标准距离为4000英尺,实际可以达到3000米。
远远大于RS232的距离。
4.接收器数量不同。
RS485接收器最多可以达到128个,即多站能力。
而RS232只能是一个,即单站接点。
5.RS232是全双工的通信协议,RS485是半双工的通信协议。
接口方法:
一般RS232和RS485都采用屏蔽双绞线传输。
RS485和RS232都采用DB9的接头
3.2各类串口的协议
串行通信协议:
计算机与外设或计算机之间的通信通常有两种方式:
并行通信和串行通信。
并行通信指数据的各位同时传送。
并行方式传输数据速度快,但占用的通信线多,传输数据的可靠性随距离的增加而下降,只适用于近距离的数据传送。
串行通信是指在单根数据线上将数据一位一位地依次传送。
发送过程中,每发送完一个数据,再发送第二个,依此类推。
接受数据时,每次从单根数据线上一位一位地依次接受,再把它们拼成一个完整的数据。
在远距离数据通信中,一般采用串行通信方式,它具有占用通信线少、成本低等优点。
1、串行通信的基本概念
(1)同步和异步通信方式
串行通信有两种最基本的通信方式:
同步串行通信方式和异步串行通信方式。
同步串行通信方式是指在相同的数据传送速率下,发送端和接受端的通信频率保持严格同步。
由于不需要使用起始位和停止位,可以提高数据的传输速率,但发送器和接受器的成本较高。
异步串行通信是指发送端和接受端在相同的波特率下不需要严格地同步,允许有相对的时间时延,即收、发两端的频率偏差在10%以内,就能保证正确实现通信。
异步通信在不发送数据时,数据信号线上总是呈现高电平状态,称为空闲状态(又称MARK状态)。
当有数据发送时,信号线变成低电平,并持续一位的时间,用于表示发送字符的开始,该位称为起始位,也称SPACE状态。
起始位之后,在信号线上依次出现待发送的每一位字符数据,并且按照先低位后高位的顺序逐位发送。
采用不同的字符编码方案,待发送的每个字符的位数不同,在5、6、7或8位之间选择。
数据位的后面可以加上一位奇偶校验位,也可以不加,由编程指定。
最后传送的是停止位,一般选择1位、1.5位或2位。
(2)数据传送方式
①单工方式。
单工方式采用一根数据传输线,只允许数据按照固定的方向传送。
图8(a)中A只能作为发送器,B只能作为接收器,数据只能从A传送到B,不能从B传送到A。
②半双工方式。
半双工方式采用一根数据传输线,允许数据分时地在两个方向传送,但不能同时双向传送。
图8(b)中在某一时刻,A为发送器,B为接收器,数据从A传送到B;而在另一个时刻,A可以作为接收器,B作为发送器,数据从B传送到A。
③全双工方式。
全双工方式采用两根数据传输线,允许数据同时进行双向传送。
图8(c)中A和B具有独立的发送器和接收器,在同一时刻,既允许A向B发送数据,又允许B向A发送数据。
(3)波特率波特率是指每秒内传送二进制数据的位数,以b/s和bps(位/秒)为单位。
它是衡量串行数据传送速度快慢的重要指标和参数。
计算机通信中常用的波特率是:
110,300,600,1200,2400,4800,9600,19200bps。
(4)串行通信的检错和纠错在串行通信过程中存在不同程度的噪声干扰,这些干扰有时会导致在传输过程中出现差错。
因此在串行通信中对数据进行校验是非常重要的,也是衡量通信系统质量的重要指标。
检错,就是如何发现数据传输过程中出现的错误,而纠错就是在发现错误后,如何采取措施纠正错误。
①误码率误码率是指数据经传输后发生错误的位数与总传输位数之比。
在计算机通信中,一般要求误码率达到10-6数量级。
误码率与通信过程中的线路质量、干扰、波特率等因素有关。
②奇偶校验奇偶校验是常用的一种检错方式。
奇偶校验就是在发送数据位最后一位添加一位奇偶校验位(0或1),以保证数据位和奇偶校验位中1的总和为奇数或偶数。
若采用偶校验,则应保证1的总数为偶数;若采用奇校验,则应保证1的总和为奇数。
在接受数据时,CPU应检测数据位和奇偶校验位中1的总数是否符合奇偶校验规则,如果出现误码,则应转去执行相应的错误处理服务程序,进行后续纠错。
③纠错在基本通信规程中一般采用奇偶校验或方阵码检错,以重发方式进行纠错。
在高级通信中一般采用循环冗余码(CRC)检错,以自动纠错方式来纠错。
一般说来,附加的冗余位越多,检测、纠错能力就越强,但通信效率也就越低。
2、串行通信接口标准
串行通信接口按电气标准及协议来分包括RS-232、RS-422、RS485、USB等。
RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。
USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域。
(1)RS-232串行接口
目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。
RS-232被定义为一种在低速率串行通信中增加通信距离的单端标准。
RS-232采取不平衡传输方式,即所谓单端通信。
1脚定义
RS-232物理接口标准可分成25芯和9芯D型插座两种,均有针、孔之分。
其中TX(发送数据)、RX(接受数据)和GND(信号地)是三条最基本的引线,就可以实现简单的全双工通信。
DTR(数据终端就绪)、DSR(数据准备好)、RTS(请求发送)和CTS(清除发送)是最常用的硬件联络信号。
RS-232接口定义及连线
RS-232/串口/异步口/com(通信)口
严格的讲RS-232接口是DTE(数据终端设备)和DCE(数据通信设备)之间的一个接口。
远程通信终端设备DTE(DateTerminalEquipment)
数据通信设备DCE(DataCommuncationEquipment)
DTE包括计算机、终端、串口打印机等。
(针输出)
DCE通常有调制解调器(MODEM)和某些交换机com口。
(孔输出)
RS-232C标准中提到的“发送”和“接收”,都是站在DTE立场立场上。
1.电气特性
TxDRxD
逻辑1(MARK)=-3v~-15v
逻辑0(MARK)=+3v~+15v
RTSCTSDSRDTRDCD等
信号有效(接通,ON状态,正电压)=+3v~+15v
信号无效(断开,OFF状态,负电压)=-3v~-15v
与TTL以高低平表示逻辑状态的规定不同。
因此,为了能同计算机接口或终端的TTL器件连接,必须进行电平和逻辑关系的变换。
广泛采用集成电路转换器件,MC1488、SN75150(TTL->EIA)、MAX232(TTL<->EIA)。
2.连接器的机械特性
DB-9连接器:
AT机以后,不支持20MA电流环接口,使用DB-9,作为提供多若功能I/O卡或主板上COM1/COM2两个串口的连接器。
电缆长度:
通信速率低于20kb/s时,RS-232C直接连接最大15m。
最大传输距离:
若不使用MODEM,码元畸变小于4%的情况下,最大15m。
3.RS-232C的接口信号常用的只有9根,标准25根,4条数据、11条控制线、3条定时、7条备用。
远距离通信1.采用MODEM(DCE)和电话网通信连接发送数据,只要通信链路已建立,就可传送信号。
RTS/CTS可只用于半工发送/接收切换。
DTE获CTS,通过TxD线向DCE发出串行信号。
计算机向DCE“数据输出寄存器”传送新的数据。
当对方DCE收到载波信号后,向对方DTE发出DCD信号。
2.采用专用电话通信:
只使用2-8号信号线,不需要RI、DTR。
近距离通信
1.零MODEM(3线制)<1>RTS与CTS互联:
只要请示,立即得到允许。
<2>DTR与DSR互联:
只要本端准备好,立即认为本端可以接收。
2.零MODEM标准连接<1>当甲方DTE准备好,发出DTR信号,该信号直接联至乙方的RI和DSR,即只要甲方准备好,乙方立即产生呼叫RI有效,并用时准备好DSR,尽管乙方并不存在DCE。
<2>甲方RTS和CTS相连,并与乙方DCD互连。
即:
一旦甲方请求,立即得到允许CTS,同时乙方DCD有效,即检测到载波信号。
<3>甲方TxD与乙方RxD相连,一发一收。
--------------------------------------------------------------------------------
DTE9芯25芯25芯9芯DCE
终端302<------------>023通信
针输出203<------------>032针输出
704<------------>047
805<------------>058
606<------------>066
507<------------>075
108<------------>081
420<------------>204
922<------------>229
按照RS232标准,传输速率一般不超过20kbps,传输距离一般不超过15M。
实际使用时通信速率最高可达bps。
②RS232串行接口基本接线原则设备之间的串行通信接线方法,取决于设备接口的定义。
设备间采用RS232串行电缆连接时有两类连接方式:
直通线:
即相同信号(Rxd对Rxd、Txd对Txd)相连,用于DTE(数据终端设备)与DCE(数据通信设备)相连。
如计算机与MODEM(或DTU)相连。
交叉线:
即不同信号(Rxd对Txd、Txd对Rxd)相连,用于DTE与DTE相连。
③RS232的三种接线方式
三线方式:
即两端设备的串口只连接收、发、地三根线。
一般情况下,三线方式即可满足要求,如监控主机与采集器及大部分智能设备之间相连。
4所使用到的技术分析
在VC++中有两种方法可以进行串口通讯。
一种是利用Microsoft公司提供的ActiveX控件MicrosoftCommunicationsControl。
另一种是直接用VC++访问串口。
下面将简述这两种方法。
一、MicrosoftCommunicationsControl
Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。
在使用它之前,应将控件加在应用程序的对话框上。
然后再用ClassWizard生成相应的对象。
现在我们可以使用它了。
该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。
推荐用程序设置,这样更灵活。
SetCommPort:
指定使用的串口。
GetCommPort:
得到当前使用的串口。
SetSettings:
指定串口的参数。
一般设为默认参数"9600,N,8,1"。
这样方便与其他串口进行通讯。
GetSettings:
取得串口参数。
SetPortOpen:
打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。
GetPortOpen:
取得串口状态。
GetInBufferCount:
输入缓冲区中接受到的字符数。
SetInPutLen:
一次读取输入缓冲区的字符数。
设置为0时,程序将读取缓冲区的全部字符。
GetInPut:
读取输入缓冲区。
GetOutBufferCount:
输出缓冲区中待发送的字符数。
SetOutPut:
写入输出缓冲区。
一般而言,使用上述函数和属性就可以进行串口通讯了。
以下是一个范例。
#defineMESSAGELENGTH100classCMyDialog:
publicCDialog{protected:
VARIANTInBuffer;VARIANTOutBuffer;CMSCommm_Com;public:
......}
BOOLCMyDiaLog:
:
OnInitDialog(){CDialog:
:
OnInitDialog();m_Com.SetCommPort
(1);if(!
m_Com.GetPortOpen())
{m_Com.SetSettings("57600,N,8,1");m_Com.SetPortOpen(true);m_Com.SetInBufferCount(0);
SetTimer(1,10,NULL);
InBuffer.bstrVal=newunsignedshort[MESSAGELENGTH];OutBuffer.bstrVal=newunsignedshort[MESSAGELENGTH];OutBuffer.vt=VT_BSTR;}
returntrue;}
voidCMyDiaLog:
:
OnTimer(UINTnIDEvent){if(m_Com.GetInBufferCount()>=MESSAGELENGTH){InBuffer=m_Com.GetInput();
//handletheInBuffer.
//FilltheOutBuffer.m_Com.SetOutput(OutBuffer);}CDialog:
:
OnTimer(nIDEvent);}用该控件传输的数据是UNICODE格式。
关于UNICODE和ANSI的关系和转换请参看MSDN。
二、直接用VC++访问串口。
在VC++中,串口和磁盘文件可以统一的方式来简单读写。
这两者几乎没有什么不同,只是在WINDOWS9X下磁盘文件只能做同步访问,而串口只能做异步访问。
CreateFile:
用指定的方式打开指定的串口。
通常的方式为m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);m_hCom为文件句柄。
GENERIC_READ|GENERIC_WRITE指定可以对串口进行读写操作。
第三个参数0表示串口为独占打开。
OPEN_EXISTING表示当指定串口不存在时,程序将返回失败。
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED则表示文件属性。
当打开串口时,必须指定FILE_FLAG_OVERLAPPED,它表示文件或设备不会维护访问指针,则在读写时,必须使用OVERLAPPED结构指定访问的文件偏移量。
ReadFile:
读取串口数据。
WriteFile:
向串口写数据。
CloseHandle:
关闭串口。
COMMTIMEOUTS:
COMMTIMEOUTS主要用于串口超时参数设置。
COMMTIMEOUTS结构如下:
typedefstruct_COMMTIMEOUTS{
DWORDReadIntervalTimeout;
DWORDReadTotalTimeoutMultiplier;
DWORDReadTotalTimeoutConstant;
DWORDWriteTotalTimeoutMultiplier;
DWORDWriteTotalTimeoutConstant;}
COMMTIMEOUTS,*LPCOMMTIMEOUTS;ReadIntervalTimeout:
两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间读取函数将返回现有的数据。
设置为0表示该参数不起作用。
ReadTotalTimeoutMultiplier:
读取每字符间的超时。
ReadTotalTimeoutConstant:
一次读取串口数据的固定超时。
所以在一次读取串口的操作中超时为ReadTotalTimeoutMultiplier乘以读取的字节数再加上ReadTotalTimeoutConstant。
将ReadIntervalTimeout设置为MAXDWORD,并将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。
WriteTotalTimeoutMultiplier:
写入每字符间的超时。
WriteTotalTimeoutConstant:
一次写入串口数据的固定超时。
所以在一次写入串口的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上WriteTotalTimeoutConstant。
SetCommTimeouts函数可以设置某设备句柄的超时参数,要得到某设备句柄的超时参数可以用GetCommTimeouts函数。
DCB:
DCB结构主要用于串口参数设置。
其中下面两个是比较重要的属性。
BaudRate:
串口的通讯速度。
一般设置为9600。
ByteSize:
字节位数。
一般设置为8。
DCB结构可以用SetCommState函数来设置,并可以用GetCommState来得到现有串口的属性。
SetupComm:
设置串口输入、输出缓冲区。
OVERLAPPED:
保存串口异步通讯的信息。
具体结构如下:
typedefstruct_OVERLAPPED{
DWORDInternal;
DWORDInternalHigh;
DWORDOffset;
DWORDOffsetHigh;
HANDLEhEvent;}
OVERLAPPED;
Internal,InternalHigh是保留给系统使用的,用户不需要设置。
Offset,OffsetHigh是读写串口的偏移量,一般设置OffsetHigh为NULL,可以支持2GB数据。
&m_OverlappedRead );
if( !
bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return dwBytesRead; }
return 0; }
return dwBytesRead; }
DWORD CSerial:
:
SendData( const char *buffer, DWORD dwBytesWritten) {
if( !
m_bOpened || m_hComDev == NULL ) return( 0 ); BOOL bWriteStat;
bWriteStat = WriteFile( m_hComDev, buffer, dwBytesWritten, &dwBytesWritten,
&m_OverlappedWrite );
if( !
bWriteStat){
if ( GetLastError() == ERROR_IO_PENDING ) {
WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ); return dwBytesWritten; }
return 0; }
return dwBytesWritten; }
5软件简介和代码
简介:
本软件能以ASCII码或十六进制接收或发送任何数据或字符,可设置所用的串口参数和自动发送时间。
软件编译,运行环境:
MicrosoftVisualC++6.0
数据发送代码
if(m_nOutPutMode>0)
{
CByteArray
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串口 通信 调试 助手 设计