




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育培训机构品牌建设与市场推广策略:教育培训行业品牌合作模式研究报告
- 九年级历史上册 第五单元 第12课 西欧走出中古时代说课稿 华东师大版
- 2025年中国高纯环己烷行业市场分析及投资价值评估前景预测报告
- 14.我的收藏卡教学设计-2025-2026学年小学美术二年级下册人美版(常锐伦、欧京海)
- 医疗意外险知识培训内容课件
- 江苏省扬州市高中地理 第一单元 探索海洋奥秘 1.2 海水性质与海水运动说课稿 鲁教版选修2
- 一年级道德与法治下册 第一单元 我和春天在一起 4《让疾病走开》说课稿 鄂教版
- 2024-2025学年高中数学 第1章 三角函数 6 6.1 余弦函数的图像 6.2 余弦函数的性质(教师用书)说课稿 北师大版必修4
- 汽车维护的分类和内容说课稿-2025-2026学年中职专业课-汽车保养与维护-汽车运用与维修-交通运输大类
- 第3节 信息的处理说课稿初中信息技术粤教清华版七年级下册-粤教清华版
- 安徽省农村信用社联合社2026年校园招聘备考考试题库附答案解析
- 2025加工定做合同范本
- 2025湖北宜昌市不动产交易和登记中心招聘编外聘用人员17人考试参考试题及答案解析
- 教PEP版六年级英语上册第一次月考试卷(Unit 1-2).(含答案含听力原文)
- 铁路局安全理论培训课件
- 【幼儿角色游戏中教师的有效介入的方法及实施效果探析11000字(论文)】
- (高清版)DZT 0280-2015 可控源音频大地电磁法技术规程
- 六年级分数应用题100题及答案
- 大数据技术及应用教学课件大数据分析挖掘-关联规则
- 部队卫生勤务知识教案设计
- 第6章 会展产业结构及优化
评论
0/150
提交评论