WindowsXPRS485通讯测试程序.doc_第1页
WindowsXPRS485通讯测试程序.doc_第2页
WindowsXPRS485通讯测试程序.doc_第3页
WindowsXPRS485通讯测试程序.doc_第4页
WindowsXPRS485通讯测试程序.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。操作说明:1. 把COM1,COM2的设置成RS485, 。2. 用短接线把 的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。3. 进入系统, 运行RS485Test.exe。4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R) 在这里选择是要发送还是接收。回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。#include #include #include #include Serial.h/RS485 测试程序int RS485Test()unsigned int unComNum1 = 0; /unsigned int unComNum2 = 0;unsigned char ucCom1Mod = 0;unsigned char ucCom2Mod = 0;char chCom5 = 0;CSerial serial1;CSerial serial2;char buffer1024 = 0;long lSendCounter = 0;char szSendBuff1024 = 0;DWORD dwRead = 0;int i = 0;/=输入COM1的端口号和工作模式=/fprintf(stdout, nEnter COM1 Number (1,2) : );/scanf(%d, &unComNum1);unComNum1 = 1;fprintf(stdout, Change COM1 mode: Send or Read(s or r) : );scanf(%s, &ucCom1Mod);memset(chCom, 0, 5);sprintf(chCom, COM%d, unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer) fprintf(stdout, Cant InitCOM Com1.n);return -1;/=输入COM2的端口号和工作模式=/ fprintf(stdout, nEnter COM2 Number (1, 2) : );/ scanf(%d, &unComNum2);unComNum2 = 2;fprintf(stdout, Change COM2 mode: Send or Read(s or r) : );scanf(%s, &ucCom2Mod);memset(chCom, 0, 5);sprintf(chCom, COM%d, unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer) fprintf(stdout, Cant InitCOM Com2.n);return -1;fprintf(stdout, Input Send data : );scanf(%s, szSendBuff);for(int k = 0; k 10; k+)if( (ucCom1Mod=s) | (ucCom1Mod=S) )serial1.SendData(szSendBuff, strlen(szSendBuff);if( (ucCom2Mod=s) | (ucCom2Mod=S) )serial2.SendData(szSendBuff, strlen(szSendBuff);Sleep(100);if( (ucCom1Mod=r) | (ucCom1Mod=R) )memset(buffer, 0, sizeof(buffer);dwRead = serial1.ReadData(buffer, sizeof(buffer);printf(COM1 k=%d, Receive DataLen=%d, Data(HEX): , k, dwRead);for(i = 0; i dwRead; i+)printf(%x, bufferi);printf(n);if( (ucCom2Mod=r) | (ucCom2Mod=R) )memset(buffer, 0, sizeof(buffer);dwRead = serial2.ReadData(buffer, sizeof(buffer);printf(COM2 k=%d, Receive DataLen=%d, Data(HEX): , k, dwRead);for(i = 0; i dwRead; i+)printf(%x, bufferi);printf(n);serial1.Close();serial2.Close();return 0;int main(int argc, char *argv)RS485Test();return 0;/ Serial.cpp: implementation of the CSerial class./#include #include #include #include #include Serial.h/ Construction/Destruction/CSerial:CSerial()memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED); memset(&m_OverlappedWrite, 0, sizeof( OVERLAPPED);m_hIDComDev = NULL;fWaitingOnRead = FALSE;CSerial:CSerial()Close();/* RS-485通讯说明 由于RS-485是半双工通信,故同一时刻只能发送或接收。RS-485的发送与接收由串行口的RTS信号控制。一般在打开485端口时,需要将RTS设置为低,以便该端口处于接收状态,当该端口需要发送时需要将RTS置为高。*/*/*Function : 初始化COM端口/*Input : strPort : 端口名称,比如COM1/* nBaud : 波特率, 比如 9600/* nByteSize : 数据位, 比如 8/* nParity : 奇偶校验位, NOPARITY 表示 No parity, EVENPARITY表示Even; MARKPARITY表示Mark;ODDPARITY表示Odd; SPACEPARITY表示Space /* nStopBits : 停止位, ONESTOPBIT 表示 1 stop bit; ONE5STOPBITS 表示 1.5 stop bits; TWOSTOPBITS 表示 2 stop bits ;/* iFlowControl : 暂时不用, /* 上面参数更详细的说明,可参考MSDN。/*Output : 无/*RetValue : 成功返回TRUE, 失败返回FALSE/*Author : xxx at 2010-11-17 16:11:41/*/BOOL CSerial:InitCOM(const char *strPort, int nBaud, BYTE nByteSize, BYTE nParity, BYTE nStopBits, int iFlowControl)DCB dcb = 0;/如果已经打开串口,则直接返回if (!(m_hIDComDev=INVALID_HANDLE_VALUE) | (m_hIDComDev = NULL)return TRUE ;/打开串口m_hIDComDev = CreateFile( strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);if (m_hIDComDev = INVALID_HANDLE_VALUE)return FALSE;memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED); memset(&m_OverlappedWrite, 0, sizeof( OVERLAPPED);m_OverlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);m_OverlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);SetupComm(m_hIDComDev, MAX_READ_BUFFER, MAX_WRITE_BUFFER); /设置输入输出缓冲区/设置通讯参数,即设置波特率,数据位,停止位,奇偶校验位dcb.DCBlength = sizeof(DCB);GetCommState(m_hIDComDev, &dcb);dcb.BaudRate = nBaud;if (nByteSize 8)nByteSize = 8;dcb.ByteSize = nByteSize;if (nStopBits 2)nStopBits = 0;dcb.StopBits = nStopBits;if( nParity 4)nParity = 0;dcb.Parity = nParity ;/ 对dcb配置进行修改 dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fParity = TRUE;dcb.XonLim = 100;dcb.XoffLim = 100;if (!SetCommState( m_hIDComDev, &dcb ) | m_OverlappedRead.hEvent=NULL | m_OverlappedWrite.hEvent=NULL)DWORD dwError = GetLastError();fprintf(stdout, nerror at connect.n);printf(dwError = %d n, dwError);return FALSE;/设置超时COMMTIMEOUTS CommTimeOuts;CommTimeOuts.ReadIntervalTimeout = 1;CommTimeOuts.ReadTotalTimeoutMultiplier = 0;CommTimeOuts.ReadTotalTimeoutConstant = 0;CommTimeOuts.WriteTotalTimeoutMultiplier = 0;CommTimeOuts.WriteTotalTimeoutConstant = 0;SetCommTimeouts(m_hIDComDev, &CommTimeOuts );/* 来自MSDN BOOL EscapeCommFunction(HANDLE hFile, / handle to communications deviceDWORD dwFunc / extended function to perform); Parameters hFile Handle to the communications device. The CreateFile function returns this handle. dwFunc Specifies the code of the extended function to perform. This parameter can be one of the following values: Value Meaning CLRDTR Clears the DTR (data-terminal-ready) signal. CLRRTS Clears the RTS (request-to-send) signal. SETDTR Sends the DTR (data-terminal-ready) signal. SETRTS Sends the RTS (request-to-send) signal. SETXOFF Causes transmission to act as if an XOFF character has been received. SETXON Causes transmission to act as if an XON character has been received. SETBREAK Suspends character transmission and places the transmission line in a break state until the ClearCommBreak function is called (or EscapeCommFunction is called with the CLRBREAK extended function code). The SETBREAK extended function code is identical to the SetCommBreak function. Note that this extended function does not flush data that has not been transmitted. CLRBREAK Restores character transmission and places the transmission line in a nonbreak state. The CLRBREAK extended function code is identical to the ClearCommBreak function. */设置硬件流控, 注意RTS初始化时设为低(Set RTS low), 即默认处于接收状态EscapeCommFunction(m_hIDComDev, CLRRTS); if (!EscapeCommFunction(m_hIDComDev, SETDTR) / return FALSE; /清空串口PurgeComm(m_hIDComDev, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);return TRUE;/*/*Function : 向485串口发送数据/*Input : pszBuf,发送数据缓冲区/* nBufLen,发送数据长度/*Output : 无/*RetValue : 返回实际发送字节数/*Author : /*/int CSerial:SendData(const char *pszBuf, int nBufLen)DWORD dwLastError; DWORD dwNumberOfBytesWritten = 0; DWORD dwWhereToStartWriting = 0; DWORD dwNumberOfBytesToWrite = nBufLen; DWORD dwHandleSignaled;/设置硬件流控, 注意发送时RTS设为高(Set RTS high)EscapeCommFunction(m_hIDComDev, SETRTS);DWORD dwBytesWritten = 0;if (m_hIDComDev = INVALID_HANDLE_VALUE) | (m_hIDComDev = NULL) fprintf(stdout, 无效的串行口地址);return -1; do /发送数据if (!:WriteFile(m_hIDComDev, pszBuf + dwWhereToStartWriting, dwNumberOfBytesToWrite, &dwNumberOfBytesWritten, &m_OverlappedWrite) dwLastError = GetLastError(); if (dwLastError != ERROR_IO_PENDING) fprintf(stdout, 串行口已关闭); return -1; dwHandleSignaled = WaitForSingleObject(m_OverlappedWrite.hEvent, INFINITE); switch (dwHandleSignaled) case WAIT_OBJECT_0: break; case WAIT_ABANDONED: / Wait failed. Shouldnt happen. return -1; default: / This case should never occur. return -1; if (!GetOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwNumberOfBytesWritten, TRUE) dwLastError = GetLastError();fprintf(stdout, 重叠查询结果失败); return -1; dwNumberOfBytesToWrite -= dwNumberOfBytesWritten; dwWhereToStartWriting += dwNumberOfBytesWritten; while(dwNumberOfBytesToWrite 0); return dwNumberOfBytesWritten;/*/*Function : 从485串口接收数据/*Input : buffer, 接收数据缓冲区/* dwReadLen, 接收数据长度/*Output : 无/*RetValue : 返回实际读取数据长度/*Author : /*/int CSerial:ReadData(void *buffer, int dwReadLen) DWORD dwResult = 0; BOOL bReadState = FALSE;DWORD dwRealReadLen = 0; /实际读取字节数DWORD dwErrorFlags = 0;COMSTAT ComStat;EscapeCommFunction(m_hIDComDev, CLRRTS);if (m_hIDComDev=INVALID_HANDLE_VALUE) | (m_hIDComDev = NULL) return -1;/解决空读情况下,程序死掉的问题。原因:空读的话,原来程序的线程会一直在等待读取字符, Add by xxx at 2010-10-26 10:21ClearCommError(m_hIDComDev, &dwErrorFlags, &ComStat);dwReadLen = min(dwReadLen, (DWORD)ComStat.cbInQue); bReadState = ReadFile(m_hIDComDev, buffer, dwReadLen, &dwRealReadLen, &m_OverlappedRead);if(!bReadState) /非0表示失败,0表示成功if(GetLastError() = ERROR_IO_PENDING)dwResult = WaitForSingleObject(m_OverlappedRead.hEvent, 500);switch (dwResult)case WAIT_OBJECT_0:if (!GetOverlappedResult(m_hIDComDev, &m_OverlappedRead, &dwRealReadLen, FALSE) if (GetLastError() = ERROR_OPERATION_ABORTED)return -1; else if (dwRealReadLen) / read completed successfullyreturn dwRealReadLen; break;case WAIT_TIMEOUT: return 0; default:break;return dwRealReadLen;/*/*Function : 关闭打开的串口/*Input : 无/*Output : 无/*RetValue : 成功返回TRUE,失败返回FALSE/*Author : /*/BOOL CSerial:Close(void)if (m_OverlappedRead.hEvent != NULL) CloseHandle(m_OverlappedRead.hEvent);m_OverlappedRead.hEvent = NULL;if (m_OverlappedWrite.hEvent != NULL) CloseHandle(m_OverlappedWrite.hEvent); m_OverlappedWrite.hEvent = NULL;if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论