Commit 4912fd1d8318894c1ca6796800f1028a1d8beb20

Authored by xiemeng
1 parent e82e4414

1 波特率强制为961200

2 兼容10以上的COM口
3 遍历可用COM端口
Showing 1 changed file with 282 additions and 1 deletions
@@ -244,7 +244,7 @@ BOOL InitTTYInfo() @@ -244,7 +244,7 @@ BOOL InitTTYInfo()
244 CURSORSTATE( TTYInfo ) = CS_HIDE ; 244 CURSORSTATE( TTYInfo ) = CS_HIDE ;
245 PORT( TTYInfo ) = 1 ; 245 PORT( TTYInfo ) = 1 ;
246 #ifdef __OPTEK_EDIT__ 246 #ifdef __OPTEK_EDIT__
247 - BAUDRATE( TTYInfo ) = BaudTable[2] ; 247 + BAUDRATE( TTYInfo ) = 921600;
248 #else 248 #else
249 BAUDRATE( TTYInfo ) = CBR_9600 ; 249 BAUDRATE( TTYInfo ) = CBR_9600 ;
250 #endif 250 #endif
@@ -403,14 +403,17 @@ HISTORY: Date: Author: Comment: @@ -403,14 +403,17 @@ HISTORY: Date: Author: Comment:
403 -----------------------------------------------------------------------------*/ 403 -----------------------------------------------------------------------------*/
404 HANDLE SetupCommPort() 404 HANDLE SetupCommPort()
405 { 405 {
  406 + int myintPort;
406 // 407 //
407 // get tty settings from settings dialog 408 // get tty settings from settings dialog
408 // 409 //
409 UpdateTTYInfo(); 410 UpdateTTYInfo();
  411 + myintPort = atoi(gszPort+3);
410 412
411 // 413 //
412 // open communication port handle 414 // open communication port handle
413 // 415 //
  416 + sprintf(gszPort, "\\\\.\\COM%d", myintPort);///可以显示COM10以上端口//add by itas109 2014-01-09
414 COMDEV( TTYInfo ) = CreateFile( gszPort, 417 COMDEV( TTYInfo ) = CreateFile( gszPort,
415 GENERIC_READ | GENERIC_WRITE, 418 GENERIC_READ | GENERIC_WRITE,
416 0, 419 0,
@@ -618,3 +621,281 @@ BOOL DisconnectOK() @@ -618,3 +621,281 @@ BOOL DisconnectOK()
618 621
619 return ((MessageBox(ghwndMain, "OK to Disconnect?", gszPort, MB_YESNO)) == IDYES); 622 return ((MessageBox(ghwndMain, "OK to Disconnect?", gszPort, MB_YESNO)) == IDYES);
620 } 623 }
  624 +/*-----------------------------------------------------------------------------
  625 +FUNCTION: QuerySingleSerialPortEx
  626 +
  627 +PURPOSE: 查询指定端口状态
  628 +-----------------------------------------------------------------------------*/
  629 +
  630 +
  631 +BOOL QuerySingleSerialPortEx(int nPort)
  632 +{
  633 + char strComm[50];
  634 + BOOL bValid = TRUE;
  635 + HANDLE hComm;
  636 + int nError;
  637 +
  638 +
  639 + sprintf(strComm,"COM%d",nPort);
  640 + if (nPort >= 10)
  641 + {//微软的技术手册规定打开端口号大于9的串口时应该使用"\\.\COM10"格式的文件名,更多的信息请参考msdn。
  642 + sprintf(strComm,"\\\\.\\COM%d",nPort);
  643 + }
  644 +
  645 + hComm = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,\
  646 + OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
  647 + nError = GetLastError();
  648 +
  649 + if(INVALID_HANDLE_VALUE == hComm)
  650 + {//***********如果没有该设备,或者被其他应用程序占用********
  651 + if(2 == nError)
  652 + bValid = -1;
  653 + else if(5 == nError)
  654 + bValid = FALSE;
  655 + else
  656 + bValid = FALSE;
  657 + }
  658 + CloseHandle(hComm); //重要 关闭文件句柄 = 关闭串口
  659 + return bValid;
  660 +}
  661 +
  662 +
  663 +/*-----------------------------------------------------------------------------
  664 +FUNCTION: QuerySingleSerialPortEx
  665 +
  666 +PURPOSE: 查询指定范围端口状态
  667 +利用API查询指定范围内的串口状态信息,并分别返回指定范围内系统存在的串口,
  668 +当前未被占用的可用串口,已被占用的串口和系统不存在的串口
  669 +*/
  670 +
  671 +void QuerySerialPortStatusEx(int *AryNoneOpenedPort,int nStartPort,int nLastPort)
  672 +{
  673 + char strTmp[50],strComm[50],strFree[50];
  674 + int n1 = nStartPort,n2=nLastPort,i,loop = 0;
  675 + HANDLE hComm;
  676 + int nLastError;
  677 + //对输入的参数进行检查
  678 + if(nStartPort < 1) nStartPort = 1;
  679 + if(nStartPort > 65535) nStartPort = 65535;
  680 + if(nLastPort < 1) nLastPort = 1;
  681 + if(nLastPort > 65535) nLastPort = 65535;
  682 + nStartPort = min(n1,n2);
  683 + nLastPort = max(n1,n2);
  684 + memset(AryNoneOpenedPort,0,255);
  685 +
  686 +
  687 + for (i = nStartPort;i<=nLastPort;i++)
  688 + {
  689 + sprintf(strComm,"COM%d",i);
  690 + if (i >= 10)
  691 + {//微软的技术手册规定打开端口号大于9的串口时应该使用"\\.\COM10"格式的文件名,更多的信息请参考msdn。
  692 + sprintf(strComm,"\\\\.\\COM%d",i);
  693 + }
  694 + // 这里的CreateFile函数起了很大的作用,可以用来创建系统设备文件,如果该设备不存在或者被占用,则会返回一个错误,即下面的 INVALID_HANDLE_VALUE ,据此可以判断可使用性。详细参见MSDN中的介绍。
  695 + hComm = CreateFile(strComm,GENERIC_READ | GENERIC_WRITE,0,NULL,\
  696 + OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
  697 + nLastError = GetLastError();
  698 + //strComm.TrimLeft("\\\\.\\");
  699 +
  700 + if(hComm != INVALID_HANDLE_VALUE)
  701 + {//串口存在且未被占用
  702 + AryNoneOpenedPort[loop] = i;
  703 + loop++;
  704 + }
  705 + CloseHandle(hComm); //关闭文件句柄 - 必要
  706 + }
  707 +
  708 +}
  709 +
  710 +
  711 +/*
  712 +代码说明
  713 +EscapeCommFunction()函数
  714 +指示指定的通信设备执行扩展功能。
  715 +BOOL EscapeCommFunction(
  716 + HANDLE hFile, //通信设备的句柄
  717 + DWORD dwFunc //指定执行的功能
  718 +);
  719 +hFile:串行端口的Handle值,此值即为使用createFile函数后所返回的值。
  720 +dwFunc:指定串行端口必须完成的工作,由以下的常数数值组成:
  721 +CLRDTR:将DTR线路降成低电位。
  722 +CLRRTS:将RTS线路降成低电位
  723 +SETDTR:将DT&线路升成高电位。
  724 +SETRTS:RTS线路升成高电位
  725 +SETXOFF:当接收到Xoff字符时启动传输操作。
  726 +SETXON:当接收到Xon字符时启动传蝓作。
  727 +SETBREAK:没置道信状态为中断(送出Break信号)。
  728 +CLRBREAK:清除 Break信号,使传输动作继续。
  729 +请特别注意到上述的参数,包有DTR、RTS的线路控制指令,如果要个别地控制这两条线路的高低电位状态就需要硬用这个函数。
  730 +
  731 +
  732 +
  733 +GetCommState()函数功能,使用指定通信设备的当前控制设置填充设备控制块(DCB结构)
  734 +BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );
  735 +参数
  736 +hFile [in]由CreateFile函数返回的通信设备句柄。
  737 +lpDCB [out]指向返回控制设置数据的DCB结构的长指针。
  738 +typedef struct _DCB { //DCB结构声明
  739 + DWORD DCBlength; DCB结构的长度
  740 + DWORD BaudRate; 当前波特率
  741 + DWORD fBinary: 1; 二进制模式,无EOF检查
  742 + DWORD fParity: 1; 激活奇偶校验检查
  743 + DWORD fOutxCtsFlow:1; CTS输出流量控制
  744 + DWORD fOutxDsrFlow:1; DSR输出流量控制
  745 + DWORD fDtrControl:2; DTR流量控制类型
  746 + DWORD fDsrSensitivity:1; DSR安全设置
  747 + DWORD fTXContinueOnXoff: 1; XOFF持续Tx
  748 + DWORD fOutX: 1; XON/XOFF输出流量控制
  749 + DWORD fInX: 1; XON/XOFF输出流量控制
  750 + DWORD fErrorChar: 1; 激活错误替换机制
  751 + DWORD fNull: 1; 允许舍空格
  752 + DWORD fRtsControl:2; Rts流量控制
  753 + DWORD fAbortOnError:1; 有错误时放弃读/写
  754 + DWORD fDummy2:17; 保留
  755 + WORD wReserved; 现在不使用
  756 + WORD XonLim; 传送XON阀值
  757 + WORD XoffLim; 传送XOFF阀值
  758 + BYTE ByteSize; 每个字节的位数 4-8
  759 + BYTE Parity; 校验 0-4=None,Odd,Even,Mark,Space
  760 + BYTE StopBits; 0,1,2 = 1, 1.5, 2
  761 + char XonChar; 设置Tx和Rx的XON的字符
  762 + char XoffChar; 设置Tx和Rx的XOFF字符
  763 + char ErrorChar; 有错误时的替换字符
  764 + char EofChar; 表示输入结束的字符
  765 + char EvtChar; 接收事件字符
  766 + WORD wReserved1; 保留未使用
  767 +} DCB, *LPDCB;
  768 +
  769 +DCB结构中重要参数说明如下:
  770 +
  771 +Baudrate:串行端口的传输速度
  772 +fBinary:是否采用二进制方式发送数据,若设为1,表示采用二进制方式,占 一个位。由于win32只支持二进制的方式,故此值必须设置为1.
  773 +fParity:是否启动奇偶校验位检查,若设为1,表示采用奇偶校验位检查。此标志占一个位。
  774 +fOutxCtsFlow:是否采用CTS硬件流量控制。当此值设为1,而CTS引脚为底电位时,数据发送将暂停,直到CTS引脚升至高电位。占一个位。
  775 +fOutDsrFlow:是否采用DSR硬件流量控制。当此值设为1,而DSR引脚为低电位时,数据发送将暂停,直到DSR引脚升至高电位,占一个位。
  776 +fDtrControl:是否采用DTR硬件流量控制。可设为DTR_CONTROL_DISABLE(串行端口打开后设为低电位)、DTR_CONTROL_ENABLE( 串行端口打开后设为高电位)DTR_CONTROL_HANDSHAKE(启动硬件流量控制)三者之一,其常数定义数值分别是0、1、2。此标志占两个位。
  777 +fDsrSensitivity:当成True时,当DSR引脚被提升至高电位之前,串行端口将忽略任何被收到的数据。此标志占一个位的位置。
  778 +ftOutX:发送过程是否启用软件握手(XON_XOFF)。当设成1时,发送过程收到XOFF字符时停上发送,而收到XON字符时恢复发送。此标志占一个位的位置。
  779 +fInX:发送过程是否后用软件握手(XON-XOFF),当设成1时,接收过程若超过设置值(XoffLim参数决定),则送出XOFF字符:而低于设置值时(Xonlim参数决定)送出XON字符。此标志占一个位的位置。
  780 +fNuil:接收过程是否舍弃空格符。若设成1则于接收过程将自动去掉空格符。此标志占一个位的位置。
  781 +fRtsControl:是否启动RTS硬件流控制。可设为RTS_CONTROL_DISABLE(串行端凵打丌后设为低电位)、RTS_CONTROL_ENABLE(串行端口打开后设为高电位)、RTS_CONTROL_HANDSHAKE(启动硬件流量控制)、
  782 +RTSCONTROLTOGGLE(指示发过程的进行状态)四者之一,其常数是0、1、2、3。此标志占两个位的位置。
  783 +XonLim:设置发送XON字符时,输入缓冲区中的最小字节数
  784 +XoffLim:设置发送XOFF字符时,输入缓冲区中的最大字节数
  785 +ByteSize:设置数据位数。有5、6、7、8可以设置。
  786 +Parity:设置校验位检查的种类。有None、Even、Odd三种
  787 +StopBits:设置停止位数。有1、1.5、2三种
  788 +XonChar:设置XON字符
  789 +XoffChar:设置XOFF字符
  790 +
  791 +
  792 +SetCommState()函数
  793 +SetCommState()函数设置串行端口状态。如设置串口设置(波特率,校验,停止位,数据位等).
  794 +SetCommState()函数原型:
  795 +BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
  796 +hFile:串行端口的Handle值,此值即为使用CreateFile函数后返回的值。
  797 +lpDCB:设备控制块(Device Control Block, DCB)结构,将指定后的DCB结构传入。
  798 +
  799 +
  800 +WriteFile()函数
  801 +WriteFile函数,可以将数据写入一个文件或者I/O设备。该函数比fwrite函数要灵活的多,也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。
  802 +windows将串行端口当成文件来使用,因此写入串行端口数据的函数也是WriteFile。
  803 +WriteFile()函数原型:
  804 +BOOL WriteFile( HANDLE hFile,//文件句柄
  805 + LPCVOID lpBuffer,//数据缓存区指针
  806 + DWORD nNumberOfBytesToWrite,//要写的字节数
  807 + LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
  808 + LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针
  809 +);
  810 +hFile:串行端口的Handle值,句柄
  811 +lpBuffer:指向欲发送的数据
  812 +nNumberOfBytesToWrite:写入的字节数
  813 +lpNumberOfBytesWritten:指向被写入的字节数的变量地址
  814 +lpOverlapped:指向overlapped I/O的结构地址,通常用来作背景工作时同步检查用,在串行通信中若不使用异步传输,则可不使用,设成NULL即可。
  815 +
  816 +
  817 +ReadFile()函数
  818 +从文件中读出数据。与fread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽。
  819 +windows将串行端口的使用当成文件,因此读取串行端口数据的函数亦使用读文件函数ReadFile.
  820 +ReadFile()函数原型:
  821 +BOOL ReadFile(
  822 + HANDLE hFile, //文件的句柄
  823 + LPVOID lpBuffer, //接收数据的缓冲区
  824 + DWORD nNumberOfBytesToRead, //读取的字节数
  825 + LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
  826 + LPOVERLAPPED lpOverlapped
  827 + //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
  828 + //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
  829 +);
  830 +ReadFile()函数参数说明:
  831 +hFile:串行端口的Handle值,
  832 +lpBuffer:指向存储被读取数据的地址
  833 +nNumberOfBytesToRead:准备读取的数据字节数
  834 +lpNumberOfBytesRead:准备读取字节数的指针
  835 +lpOverlapped:指向overlapped I/O的结构地址,在串行通信中若不同时进行后台工作,则可不使用,设成NULL即可。
  836 +
  837 +
  838 +ClearCommError()函数
  839 +清除串行端口错误或读取串行端口现在的状态时,可用函数ClearCommError。Windows系统利用此函数清除硬件的通讯错误以及获取通讯设备的当前状态
  840 +ClearCommError()函数原型
  841 +BOOL ClearCommError( HANDLE hFile, //通信设备的句柄
  842 + LPDWORD lpErrors,//接收错误代码变量的指针
  843 + LPCOMSTAT lpStat //通信状态缓冲区的指针
  844 +);
  845 +ClearCommError()函数参数说明:
  846 +hFile:串行端冂的Handle值,此值即为使用CreateFile函数后所返回的值。
  847 +lpError:返回错误数值,错误常数如下:
  848 +CE_BREAK:检测到中断信号。
  849 +CE_DNS:Windows95专用,未被选择的并行端口。
  850 +CE_FRAME:硬件检到框架错误
  851 +CE_IOE:通信设备发生输入/输出綹误,
  852 +CE_MODE:设置模式错误,或是hFile值错误。
  853 +CE_OOP:Wmdows95专用,并行端口发生缺纸错误。CE_OVERRUN:缓冲区容量不足,数据将遗失。
  854 +CE_PTO:Windows95专用,并行端口发生超时错误。
  855 +CE_RXOVER:接收区满溢或在文件结尾被接收到后仍有数据发送过来。
  856 +CE_RXPARITY:硬件检测到校验位检查错误。
  857 +CE_TXFULL:发送缓存区已满后,应用程序仍要发送数据。
  858 +lpStat:指向通信端口状态的结构变量。此结构的原始声明如下:
  859 +typedef struct _COMSTAT { //cst
  860 + DWORD fCtsHold : 1; //Tx正在等待CTS信号
  861 + DWORD fDsrHold : 1; //Tx正在等待DSR信号
  862 + DWORD fRlsdHold : 1; //Tx正在等待RLSD信号
  863 + DWORD fXoffHold : 1; //Tx由于接收XOFF字符而在等待
  864 + DWORD fXoffSent : 1; //Tx由于发送XOFF字符而在等待
  865 + DWORD fEof : 1; //发送EOF字符
  866 + DWORD fTxim : 1; //字符在等待Tx
  867 + DWORD fReserved : 25; //保留
  868 + DWORD cbInQue; //输入缓冲区中的字节数
  869 + DWORD cbOutQue; //输出缓冲区中的字节数
  870 +} COMSTAT, *LPCOMSTAT;
  871 +此结构屮有关参数说明如下:
  872 +fCtsHold:是否正在等待CTS信号。占一个位的位置。
  873 +fDsrHold:是否正在等待DSR信号。占一个位的位置。
  874 +fRlsdHoId:是否正在等待RLSD信号。占一个位的位置。
  875 +fXoftHoId:是否因收到xoff字符而在等待。占一个位的位置。
  876 +fXoffHold:是否因送出xoff字符而使得发送的动作在等待。占一个位置
  877 +cbInQue:在输入缓冲区尚未被ReadFile函数读取的数据字节数。这个参数经常被用来进行状态检查。
  878 +cbOutQue:在发送缓冲区而尚未被发送的据字节数
  879 +
  880 +
  881 +WaitForMultipleObjects 是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象
  882 +
  883 +PurgeComm()函数
  884 +PurgeComm()函数–清空缓冲区
  885 +BOOL PurgeComm( HANDLE hFile, DWORD dwFlags );
  886 +hFile
  887 +[in]处理通信资源。该的CreateFile函数返回该句柄。
  888 +dwFlags
  889 +[in]指定要采取的操作。下表显示了可能的值。
  890 +PURGE_TXABORT 终止所有正在进行的字符输出操作,完成一个正处于等待状态的重叠i/o操作,他将产生一个事件,指明完成了写操作
  891 +PURGE_RXCLEAR 终止所有正在进行的字符输入操作,完成一个正在进行中的重叠i/o操作,并带有已设置得适当事件
  892 +PURGE_TXABORT 这个命令指导设备驱动程序清除输出缓冲区,经常与PURGE_TXABORT 命令标志一起使用
  893 +PURGE_RXCLEAR 这个命令用于设备驱动程序清除输入缓冲区,经常与PURGE_RXABORT 命令标志一起使用
  894 +
  895 +
  896 +
  897 +
  898 +
  899 +
  900 +
  901 +*/
Please register or login to post a comment