⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comtst2.c

📁 一个关于Com端口调制的程序。包括向Com端口发送数据及从Com端口接受数据两部分。
💻 C
字号:
#include <windows.h>
#include <stdio.h>

//#define COM_DEB     1

#define TEST_COM "COM1"

#define   NUM         128
#define   print       printf
#define   SETTINGS1       TEST_COM,9600,8,NOPARITY,ONESTOPBIT
#define   SETTINGS15      TEST_COM,9600,8,NOPARITY,ONE5STOPBITS
#define   SETTINGS2       TEST_COM,4800,8,NOPARITY,ONESTOPBIT
#define   SETTINGS3       TEST_COM,2400,8,NOPARITY,ONESTOPBIT
#define   SETTINGS4       TEST_COM,1200,8,NOPARITY,ONESTOPBIT


BOOL DoComIo(LPSTR lpCom,DWORD Baud,BYTE Size,BYTE Parity,BYTE Stop);
DWORD main(int argc, char *argv[], char *envp[])
{
    BOOL bRc;
    
    UNREFERENCED_PARAMETER(argc);
    UNREFERENCED_PARAMETER(argv);
    UNREFERENCED_PARAMETER(envp);
    print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        SETTINGS1);
    bRc = DoComIo(SETTINGS1);
    if (!bRc) {
        print("\n\nCOM TEST FAILED********************************\n\n");
    }
    
    
    print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        SETTINGS15);
    bRc = DoComIo(SETTINGS15);
    if (!bRc) {
        print("\n\nCOM TEST FAILED********************************\n\n");
    }
    
    print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        SETTINGS2);
    bRc = DoComIo(SETTINGS2);
    if (!bRc) {
        print("\n\nCOM TEST FAILED********************************\n\n");
    }
    
    print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        SETTINGS3);
    bRc = DoComIo(SETTINGS3);
    if (!bRc) {
        print("\n\nCOM TEST FAILED********************************\n\n");
    }
    
    print("\n\n *** Doing COM TEST with [port=%s Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        SETTINGS4);
    bRc = DoComIo(SETTINGS4);
    if (!bRc) {
        print("\n\nCOM TEST FAILED********************************\n\n");
    }
    
    return 0;
}


BOOL DoComIo(LPSTR lpCom,DWORD Baud,BYTE Size,BYTE Parity,BYTE Stop)
{
    
    CHAR WrBuffer[NUM];
    CHAR RdBuffer[NUM];
    DWORD i;
    HANDLE hCommPort;
    DCB    dcb;
    BOOL   bRc;
    DWORD  dwNumWritten,dwNumRead,dwErrors;
    
    print("\n\n *** COMM TEST START [port=%s,Baud=%d,Size=%d,Parity=%d,Stop=%d]***\n\n",
        lpCom,Baud,Size,Parity,Stop);
    
    print("Opening the comm port for read write\n");
    
    hCommPort = CreateFile(
        lpCom,
        GENERIC_READ|GENERIC_WRITE,
        0, // exclusive
        NULL, // sec attr
        OPEN_EXISTING,
        0,             // no attributes
        NULL);         // no template
    
    if (hCommPort == (HANDLE)-1)
    {
        print("FAIL: OpenComm failed rc: %lx\n",hCommPort);
        return FALSE;
    }
    
    
    print("Opening the comm port for read write: SUCCESS hCommPort=%lx\n",hCommPort);
    
    print("Setting the line characteristics on comm \n");
    
    if(!GetCommState(
        hCommPort,
        &dcb
        )) {
        printf("Could not get the state of the comm port: %d\n",GetLastError());
        return FALSE;
    }
    dcb.DCBlength   = sizeof(DCB);
    // dcb.DCBversion  = 0x0002;
    
    dcb.BaudRate = Baud;
    dcb.ByteSize = Size;
    dcb.Parity   = Parity;
    dcb.StopBits = Stop;
    
    //dcb.RlsTimeout = 10000;   10sec
    //dcb.CtsTimeout = 10000;   10sec
    //dcb.DsrTimeout = 10000;   10sec
    
    dcb.fBinary = 1;         // binary data xmit
    dcb.fParity = 0;         // dont bother about parity
    dcb.fOutxCtsFlow= 0;     // no cts flow control
    dcb.fOutxDsrFlow= 0;     // no dsr flow control
    dcb.fDtrControl = DTR_CONTROL_DISABLE;      // dont bother about dtr
    dcb.fRtsControl = RTS_CONTROL_DISABLE;      // dont bother about dtr
    dcb.fOutX =0;            //  disable xoff handling
    dcb.fInX  =0;            //  disable xon handling
    dcb.fErrorChar = 0;         // forget about parity char
    dcb.fNull =  0;          // forget about the null striping
    //dcb.fChEvt = 0;           forget about event char
    
    bRc = SetCommState(hCommPort,&dcb);
    
    if (!bRc)
    {
        print("FAIL: cannot set the comm state rc:%lx\n",bRc);
        bRc = CloseHandle(hCommPort);
        if (!bRc)
        {
            print("FAIL: cannot close the comm port:%lx\n",bRc);
        }
        return FALSE;
    }
    
    print("Setting the line characteristics on comm: SUCCESS\n");
    
    
    print("Filling the buffer with the known chars \n");
    
    for (i=0; i< NUM; i++)
    {
        //WrBuffer[i] = 'a';
        WrBuffer[i] = (CHAR)i;
        
    }
    
    print("Filling the buffer with the known chars : SUCCESS\n");
    
    
#ifdef COM_DEB
    print("Dumping the buffer before sending it to comm\n");
    
    for (i=0; i< NUM; i++)
    {
        //print("%c",RdBuffer[i]);
        print(" %d ",WrBuffer[i]);
        
    }
    
    print("\nDumping the buffer before sending it to comm SUCCESS\n");
#endif
    

#if 0
    print("Filling the Rdbuffer with the known chars (0xFF) to makeit dirty\n");
    
    for (i=0; i< NUM; i++)
    {
        RdBuffer[i] = (CHAR)'0xFF';
    }
#endif   
    print("Filling the Rdbuffer with the known chars (0xFF): SUCCESS\n");
    
    print("Writting this buffer to the comm port\n");
    
    bRc = WriteFile( hCommPort,
        WrBuffer,
        NUM,
        &dwNumWritten,
        NULL);
    
    if (!bRc)
    {
        print("FAIL: cannot Write To the comm port:%lx\n",bRc);
        bRc = CloseHandle(hCommPort);
        if (!bRc)
        {
            print("FAIL: cannot close the comm port:%lx\n",bRc);
        }
        return FALSE;
    }
    
    print("Writting this buffer to the comm port: SUCCESS rc:%lx, byteswritten:%lx\n",
        bRc,dwNumWritten);
    
    
    print("Reading this buffer from the comm port\n");
    
    bRc = ReadFile( hCommPort,
        RdBuffer,
        NUM,
        &dwNumRead,
        NULL);
    
    if (!bRc)
    {
        print("FAIL: cannot Read From the comm port:%lx\n",bRc);
        bRc = CloseHandle(hCommPort);
        if (!bRc)
        {
            print("FAIL: cannot close the comm port:%lx\n",bRc);
        }
        return FALSE;
    }
    
    print("Reading this buffer from the comm port: SUCCESS rc:%lx, bytesread:%lx\n",
        bRc,dwNumRead);
    
    
#ifdef COM_DEB
    print("Dumping the Rdbuffer with the comm data\n");
    
    for (i=0; i< NUM; i++)
    {
        //print("%c",RdBuffer[i]);
        print(" %d ",RdBuffer[i]);
        
    }
    
    print("\nDumping the Rdbuffer with the comm data: SUCCESS\n");
#endif
    
    print("Comparing the rd and wr buffers\n");
    
    for (i=0; i< NUM; i++)
    {
        if (RdBuffer[i] != WrBuffer[i])
        {
            print("FAIL: BufferMisMatch: RdBuffer[%d]=%lx,WrBuffer[%d]=%lx\n",
                i,RdBuffer[i],i,WrBuffer[i]);
            bRc = CloseHandle(hCommPort);
            if (!bRc)
            {
                print("FAIL: cannot close the comm port:%lx\n",bRc);
            }
            return FALSE;
        }
    }
    
    print("Comparing the rd and wr buffers: SUCCESS\n");
    
    
    bRc = ClearCommError(hCommPort,&dwErrors,NULL);
    print("ClearCommError: rc= %lx and dwErrors=%lx\n",bRc,dwErrors);
    
    //bRc = PurgeComm(hCommPort,0);
    print("BYPASS PurgeComm BUG (%lx,0) rc = %lx\n",hCommPort,bRc);
    
    
    print("Closing the comm port\n");
    bRc = CloseHandle(hCommPort);
    
    if (!bRc)
    {
        print("FAIL: cannot close the comm port:%lx\n",bRc);
        return FALSE;
    }
    
    
    print("\n\n*** COMM TEST OVER*** \n\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -