串口通信调试助手设计

串口通信调试助手设计学 生: (宋体五号居中)指导教师: (宋体五号居中) (楷体五号居中)1 发展历史和由来串口的出现是在1980年前后,数据传输率是115kbps~230kbps串口出现的初期 是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备串口也可以应用于两台计算机(或设备)之间的互联及数据传输由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已开始取消该接口目前串口多用于工控和测量设备以及部分通信设备中2 串口通信划分种类串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式同步串行是指SPI(Serial Peripheral interface)的缩写,顾名思义就是串行外围设备接口SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,TRM450是SPI接口异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送UART是一个并行输入成为串行输出的芯片,通常集成在主板上。
UART包含TTL电平的串口和RS232电平的串口 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、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采取不平衡传输方式,即所谓单端通信 ① 脚定义 RS-232物理接口标准可分成25芯和9芯D型插座两种,均有针、孔之分其中TX(发送数据)、RX(接受数据)和GND(信号地)是三条最基本的引线,就可以实现简单的全双工通信DTR(数据终端就绪)、DSR(数据准备好)、RTS(请求发送)和CTS(清除发送)是最常用的硬件联络信号 RS-232接口定义及连线 RS-232/串口/异步口/com(通信)口 严格的讲RS-232接口是DTE(数据终端设备)和DCE(数据通信设备)之间的一个接口 远程通信终端设备 DTE ( Date Terminal Equipment ) 数据通信设备 DCE ( Data Communcation Equipment ) DTE包括计算机、终端、串口打印机等针输出) DCE通常有调制解调器(MODEM)和某些交换机com口孔输出) RS-232C 标准中提到的“发送”和“接收”,都是站在DTE立场立场上 1. 电气特性 TxD RxD 逻辑1(MARK)= -3v ~ -15v 逻辑0(MARK)= +3v ~ +15v RTS CTS DSR DTR DCD 等 信号有效(接通,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相连,一发一收 -------------------------------------------------------------------------------- DTE 9芯 25芯 25芯 9芯 DCE 终 端 3 02 <------------> 02 3 通 信 针输出 2 03 <------------> 03 2 针输出 7 04 <------------> 04 7 8 05 <------------> 05 8 6 06 <------------> 06 6 5 07 <------------> 07 5 1 08 <------------> 08 1 4 20 <------------> 20 4 9 22 <------------> 22 9 按照RS232标准,传输速率一般不超过20kbps,传输距离一般不超过15M。
实际使用时通信速率最高可达115200bps ②RS232串行接口基本接线原则 设备之间的串行通信接线方法,取决于设备接口的定义设备间采用RS232串行电缆连接时有两类连接方式: 直通线:即相同信号(Rxd对Rxd、Txd对Txd)相连,用于DTE(数据终端设备)与DCE(数据通信设备)相连如计算机与MODEM(或DTU)相连 交叉线:即不同信号(Rxd对Txd、Txd对Rxd)相连,用于DTE与DTE相连 ③RS232的三种接线方式 三线方式:即两端设备的串口只连接收、发、地三根线一般情况下,三线方式即可满足要求,如监控主机与采集器及大部分智能设备之间相连 4 所使用到的技术分析在VC++中有两种方法可以进行串口通讯一种是利用Microsoft公司提供的ActiveX 控件 Microsoft Communications Control另一种是直接用VC++访问串口下面将简述 这两种方法 一、 Microsoft Communications Control Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单 的利用串口进行通讯。
在使用它之前,应将控件加在应用程序的对话框上然后再用 ClassWizard 生成相应的对象现在我们可以使用它了 该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置 推荐用程序设置,这样更灵活 SetCommPort:指定使用的串口 GetCommPort:得到当前使用的串口 SetSettings:指定串口的参数一般设为默认参数"9600,N,8,1"这样方便 与其他串口进行通讯 GetSettings:取得串口参数 SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使 用该串口 GetPortOpen:取得串口状态 GetInBufferCount:输入缓冲区中接受到的字符数SetInPutLen:一次读取输入缓冲区的字符数设置为0时,程序将读取缓冲区的 全部字符 GetInPut:读取输入缓冲区 GetOutBufferCount:输出缓冲区中待发送的字符数 SetOutPut:写入输出缓冲区 一般而言,使用上述函数和属性就可以进行串口通讯了。
以下是一个范例 #define MESSAGELENGTH 100 class CMyDialog : public CDialog { protected: VARIANT InBuffer; VARIANT OutBuffer; CMSComm m_Com; public: ...... } BOOL CMyDiaLog::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=new unsigned short[MESSAGELENGTH]; OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH]; OutBuffer.vt=VT_BSTR; } return true; } void CMyDiaLog::OnTimer(UINT nIDEvent) { if (m_Com.GetInBufferCount()>=MESSAGELENGTH) { InBuffer=m_Com.GetInput();// handle the InBuffer. // Fill the OutBuffer. m_Com.SetOutput(OutBuffer); } CDialog::OnTimer(nIDEvent); } 用该控件传输的数据是UNICODE格式。
关于UNICODE和ANSI的关系和转换请参 看MSDN 二、 直接用VC++访问串口 在VC++中,串口和磁盘文件可以统一的方式来简单读写这两者几乎没有什么不 同,只是在WINDOWS 9X下磁盘文件只能做同步访问,而串口只能做异步访问 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结构如下: typedef struct _COMMTIMEOUTS {DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD ReadTotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORD WriteTotalTimeoutConstant; } COMMTIMEOUTS,*LPCOMMTIMEOUTS; ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间读取函数将返回现有的数据设置为0表示该参数不起作用 ReadTotalTimeoutMultiplier:读取每字符间的超时 ReadTotalTimeoutConstant:一次读取串口数据的固定超时。
所以在一次读取串口的操作中超时为ReadTotalTimeoutMultiplier乘以读取的字节数再加上 ReadTotalTimeoutConstant将ReadIntervalTimeout设置为MAXDWORD,并将 ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即 返回存放在输入缓冲区的字符 WriteTotalTimeoutMultiplier:写入每字符间的超时 WriteTotalTimeoutConstant:一次写入串口数据的固定超时所以在一次写入串口 的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上 WriteTotalTimeoutConstantSetCommTimeouts函数可以设置某设备句柄的超时参数,要得到某设备句柄的超 时参数可以用GetCommTimeouts函数 DCB:DCB结构主要用于串口参数设置其中下面两个是比较重要的属性 BaudRate:串口的通讯速度一般设置为9600 ByteSize:字节位数。
一般设置为8 DCB结构可以用SetCommState函数来设置,并可以用GetCommState来得到现有串 口的属性 SetupComm:设置串口输入、输出缓冲区 OVERLAPPED:保存串口异步通讯的信息具体结构如下: typedef struct _OVERLAPPED { DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; HANDLE hEvent; }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码或十六进制接收或发送任何数据或字符,可设置所用的串口参数和自动发送时间。
软件编译,运行环境:Microsoft Visual C++ 6.0数据发送代码if(m_nOutPutMode > 0) { CByteArray hexdata; int len=String2Hex(m_strSendString ,hexdata); m_Com.SetOutput(COleVariant(hexdata)); } else m_Com.SetOutput(COleVariant(m_strSendString));//发送数据}定时发送代码:{ //{{AFX_DATA_INIT(CSettingDlg) m_nPort = 1; m_strSettings = _T("9600,n,8,1"); m_nTime = 1000; //}}AFX_DATA_INIT}void CCommWizardDlg::OnReceive() { // TODO: Add your control notification handler code here m_Com.GetInput();//先预读缓冲区以清除残留数据 bReceive = !bReceive; if(bReceive) m_ctrlReceive.SetWindowText(_T("停止接收")); else m_ctrlReceive.SetWindowText(_T("开始接收"));}void CCommWizardDlg::OnSend() { // TODO: Add your control notification handler code here bSend = !bSend; if(bSend) { m_ctrlSend.SetWindowText(_T("停止发送")); SetTimer(1,m_nTime,NULL);//时间为1000毫秒 } else { m_ctrlSend.SetWindowText(_T("自动发送")); KillTimer(1); //取消定时 } }运行结果:6总结与展望。