Commit 4912fd1d8318894c1ca6796800f1028a1d8beb20
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 | 244 | CURSORSTATE( TTYInfo ) = CS_HIDE ; |
| 245 | 245 | PORT( TTYInfo ) = 1 ; |
| 246 | 246 | #ifdef __OPTEK_EDIT__ |
| 247 | - BAUDRATE( TTYInfo ) = BaudTable[2] ; | |
| 247 | + BAUDRATE( TTYInfo ) = 921600; | |
| 248 | 248 | #else |
| 249 | 249 | BAUDRATE( TTYInfo ) = CBR_9600 ; |
| 250 | 250 | #endif |
| ... | ... | @@ -403,14 +403,17 @@ HISTORY: Date: Author: Comment: |
| 403 | 403 | -----------------------------------------------------------------------------*/ |
| 404 | 404 | HANDLE SetupCommPort() |
| 405 | 405 | { |
| 406 | + int myintPort; | |
| 406 | 407 | // |
| 407 | 408 | // get tty settings from settings dialog |
| 408 | 409 | // |
| 409 | 410 | UpdateTTYInfo(); |
| 411 | + myintPort = atoi(gszPort+3); | |
| 410 | 412 | |
| 411 | 413 | // |
| 412 | 414 | // open communication port handle |
| 413 | 415 | // |
| 416 | + sprintf(gszPort, "\\\\.\\COM%d", myintPort);///可以显示COM10以上端口//add by itas109 2014-01-09 | |
| 414 | 417 | COMDEV( TTYInfo ) = CreateFile( gszPort, |
| 415 | 418 | GENERIC_READ | GENERIC_WRITE, |
| 416 | 419 | 0, |
| ... | ... | @@ -618,3 +621,281 @@ BOOL DisconnectOK() |
| 618 | 621 | |
| 619 | 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