欢迎来到一句话经典语录网
我要投稿 投诉建议
当前位置:一句话经典语录 > 口号 > 串口号在串口通信

串口号在串口通信

时间:2018-06-05 02:32

请问串口通信中的串口号设置我只知道直接设置

你 有 几个 COM,不知道吗

去 设备管理器 里看看如果 编程的话,只能 试着 打开一个串口,然后 分析返回的出错信息

推荐看书Visual C++_Turbo C串口通信编程实践Visual_Basic与_RS-232_串行通信控制Delphi串口通信工程开发实例导航

串口通信中如何确定端口号

两种方法可以确认串口通信中的端口号:  1、用win32 api打开串口, 成功则可以使用,失败然后继续打开下一个串口, 就是一个com1-256的依次尝试。

就是CreateFile,ReadFile, WriteFile,注意CreateFile的第一个参数使用“\\\\\\\\.\\\\COM1”这样类似的。

  2、在PC端,能打开的都能用,但不一定是外设接上的口,所以如果不知道外设接在那个口的话,就需要扫描所有能打开的口,然后接收外设发来的呼叫声,对上暗号的就是它了。

PLC串口通讯原理

串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

什么是串口串口是计算机上一种非常通用的设备通信协议(不要与通用串行总线Universal SerialBus或者USB混淆)。

大多数计算机包含两个基于RS232的串口。

串口同时也是仪器仪表设备通用的通信接口;很多GPIB兼容的设备也带有RS-232口。

同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。

通信使用3根线完成:(1)地线,(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的。

串口通信最重要的参数是比特率、数据位、停止位和奇偶校验。

对于两个进行通信的端口,这些参数必须匹配:a,比特率:这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,就是指比特率,例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的比特率为14400,28800和36600。

比特率可以远远大于这些值,但是波特率和距离成反比。

高比特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。

如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。

扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。

每个包是指一个字节,包括开始\\\/停止位,数据位和奇偶校验位。

由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,停止位:用于表示单个包的最后一位。

典型的值为1,1.5和2位。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。

因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。

适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

d,奇偶校验位:在串口通信中一种简单的检错方式。

有四种检错方式:偶、奇、高和低。

当然没有校验位也是可以的。

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。

如果是奇校验,校验位为1,这样就有3个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。

这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

串口通讯协议是指通信双方的一种约定。

约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。

因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。

串口通信端口号显示异常

端口号可以自己修改的,后面com17后面加一段数字很正常的,我的也是这么显示的,可以正常使用,您遇到的情况应该不是这个原因造成的 。

关于串口通讯

利用串口进行数据通讯在通讯领域重占有着重要的地位。

利用RS232-RS485进行数据信号的采集和传递是VC编程的又一大热点。

串口通讯在通讯软件重有着十分广泛的应用。

如电话、传真、视频和各种控制等。

在各种开发工具中间,VC由于功能强大和灵活,同时也得到了Microsoft的最大支持,所以在一般进行涉及硬件操作的通讯编程中,大都推荐使用VC作为开发工具。

然而工业控制串口通讯这个又不同于一般的串口通讯程序,因为控制传送的大都是十六进制数据(BYTE类型),所以,为了提高程序的运行稳定性,我们在编写程序进行通讯时可以不考虑传送BYTE类型数据的工作。

串口通讯目前流行的方法大概有两种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。

二是利用WIN进行编程,这种编程的难度最高,要求你要掌握很多的。

三是利用现在网络上面提供的一些串口通讯控件进行编写,比如CSerial类等。

程序实现: 我在经过许多的项目的开发和实践中发现,采用WIN 进行串口的开发能够给程序员很大的控件,并且程序运也很稳定。

所以我将与串口接触的函数进行封装,然后在各个工程中进行调用,效果还是比较好的,现将各个函数和调用方法列举出来,希望对各位有所帮助。

一、设置串口相关工作#define MAXBLOCK 2048#define XON 0x11#define XOFF 0x13BOOL SetCom(HANDLE &m_hCom, const char *m_sPort, int BaudRate, int Databit, CString parity, CString stopbit){ COMMTIMEOUTS TimeOuts; \\\/\\\/\\\/串口输出时间 超时设置 DCB dcb; \\\/\\\/\\\/与端口匹配的设备 m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); \\\/\\\/ 以重叠方式打开串口 if(m_hCom==INVALID_HANDLE_VALUE) { AfxMessageBox(设置串口部分,串口打开失败); \\\/\\\/\\\/\\\/\\\/重叠方式 异步通信(INVALID_HANDLE_VALUE)函数失败。

return FALSE; } SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); \\\/\\\/设置缓冲区 memset(&TimeOuts,0,sizeof(TimeOuts)); TimeOuts.ReadIntervalTimeout=MAXDWORD; \\\/\\\/ 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作 TimeOuts.ReadTotalTimeoutMultiplier=0; \\\/\\\/读时间系数 TimeOuts.ReadTotalTimeoutConstant=0; \\\/\\\/读时间常量 TimeOuts.WriteTotalTimeoutMultiplier=50; \\\/\\\/总超时=时间系数*要求读\\\/写的字符数+时间常量 TimeOuts.WriteTotalTimeoutConstant=2000; \\\/\\\/设置写超时以指定WriteComm成员函数中的 SetCommTimeouts(m_hCom, &TimeOuts); \\\/\\\/GetOverlappedResult函数的等待时间*\\\/ if(!GetCommState(m_hCom, &dcb)) \\\/\\\/\\\/\\\/串口打开方式、端口、波特率 与端口匹配的设备 { AfxMessageBox(GetCommState Failed); return FALSE; } dcb.fParity=TRUE; \\\/\\\/允许 dcb.fBinary=TRUE; if(parity==NONE) dcb.Parity=NOPARITY; if(parity==ODD) dcb.Parity=ODDPARITY; if(parity==EVEN) dcb.Parity=EVENPARITY; if(stopbit==1)\\\/\\\/设置波特率 dcb.StopBits=ONESTOPBIT; \\\/\\\/if(stopbit==0)\\\/\\\/设置波特率 \\\/\\\/ dcb.StopBits=NONESTOPBIT; if(stopbit==2)\\\/\\\/设置波特率 dcb.StopBits=TWOSTOPBITS; BOOL m_bEcho=FALSE; \\\/\\\/\\\/ int m_nFlowCtrl=0; BOOL m_bNewLine=FALSE; \\\/\\\/\\\/ dcb.BaudRate=BaudRate; \\\/\\\/ 波特率 dcb.ByteSize=Databit; \\\/\\\/ 每字节位数 \\\/\\\/ 硬件流控制设置 dcb.fOutxCtsFlow=m_nFlowCtrl==1; dcb.fRtsControl=m_nFlowCtrl==1 ?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE; \\\/\\\/ XON\\\/XOFF流控制设置(软件流控制

) dcb.fInX=dcb.fOutX=m_nFlowCtrl==2; dcb.XonChar=XON; dcb.XoffChar=XOFF; dcb.XonLim=50; dcb.XoffLim=50; if(SetCommState(m_hCom, &dcb)) return TRUE; \\\/\\\/\\\/\\\/com的通讯口设置 else { AfxMessageBox(串口已打开,设置失败); return FALSE; }} 二、读串口操作:int ReadCom(HANDLE hComm, BYTE inbuff[], DWORD &nBytesRead, int ReadTime){ DWORD lrc; \\\/\\\/\\\/纵向冗余校验 DWORD endtime; \\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/jiesuo static OVERLAPPED ol; int ReadNumber=0; int numCount=0 ; \\\/\\\/控制读取的数目 DWORD dwErrorMask,nToRead; COMSTAT comstat; ol.Offset=0; \\\/\\\/\\\/相对文件开始的字节偏移量 ol.OffsetHigh=0; \\\/\\\/\\\/开始传送数据的字节偏移量的高位字,管道和通信时调用进程可忽略。

ol.hEvent=NULL; \\\/\\\/\\\/标识事件,数据传送完成时设为信号状态 ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); endtime=GetTickCount()+ReadTime;\\\/\\\/GetTickCount()取回系统开始至此所用的时间() for(int i=0;i<2000;i++) inbuff[i]=0; Sleep(ReadTime); ClearCommError(hComm,&dwErrorMask,&comstat); nToRead=min(2000,comstat.cbInQue); if(int(nToRead)<2) goto Loop; if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol)) { if((lrc=GetLastError())==ERROR_IO_PENDING) { \\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/\\\/ endtime=GetTickCount()+ReadTime;\\\/\\\/GetTickCount()取回系统开始至此所用的时间() while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE))\\\/\\\/该函数取回重叠操作的结果 { if(GetTickCount()>endtime) break; } } } return 1; Loop: return 0;}三、写串口命令int WriteCom(HANDLE hComm, BYTE Outbuff[], int size, int bWrite[]){ DWORD nBytesWrite,endtime,lrc; static OVERLAPPED ol; DWORD dwErrorMask,dwError; COMSTAT comstat; ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); ol.Offset=0; ol.OffsetHigh=0; ol.hEvent=NULL; \\\/\\\/\\\/标识事件,数据传送完成时,将它设为信号状态 ClearCommError(hComm,&dwErrorMask,&comstat); if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol)) { if((lrc=GetLastError())==ERROR_IO_PENDING) { endtime=GetTickCount()+1000; while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE)) { dwError=GetLastError(); if(GetTickCount()>endtime) { AfxMessageBox(写串口时间过长,目前串口发送缓冲区中的数据数目为空); break; } if(dwError=ERROR_IO_INCOMPLETE) continue; \\\/\\\/未完全读完时的正常返回结果 else { \\\/\\\/ 发生错误,尝试恢复

ClearCommError(hComm,&dwError,&comstat); break; } } } } FlushFileBuffers(hComm); PurgeComm(hComm,PURGE_TXCLEAR); bWrite=0; return 1;}四、调用方法很简单,只需要将你的串口参数进行简单的设置就可以了。

比如:BOOL Main_OpenCom()\\\/\\\/设置COM{ int Boundrate=9600;\\\/\\\/波特率 CString StopBits=1;\\\/\\\/停止位 int DataBits=8;\\\/\\\/数据位 CString Parity=ODD;\\\/\\\/ CString m_Port=COM1; return SetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits);}void Main(){int SIZE; DWORD BytestoRead=52*Count+6;\\\/\\\/要11个字节 int BWRITE[2]; int ReadTime=2000; BYTE Outbuff[12]={0xff,0x00,0xea,0xff,0xea,0xff,0,0,0,0,0,0}; SIZE=sizeof(Outbuff); WriteCom(m_hCom,Outbuff,SIZE,BWRITE); ReadCom(m_hCom,m_Inbuff,BytestoRead,ReadTime); \\\/\\\/进行湘阴的解包处理}

声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。联系xxxxxxxx.com

Copyright©2020 一句话经典语录 www.yiyyy.com 版权所有

友情链接

心理测试 图片大全 壁纸图片