串口是否就是Socket?
如果是,我有代码的,但数据库用的是INFORMIX

解决方案 »

  1.   

    先用WriteFile(.....)函数打开一个串口,然后用ReadFile(......)从串口中读出数据。
    接下来就向平常的数据处理一样了。
      

  2.   

    给你一段简单的代码去研究: //初始化串口
    DWORD iErr;
    BOOL bTemp;
    m_Handle = ::CreateFile(
    LPCTSTR("COM1"),
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//异步通信
    // FILE_FLAG_WRITE_THROUGH,
    NULL);
    if (m_Handle == INVALID_HANDLE_VALUE)
    {
    iErr = ::GetLastError();
    return TRUE;
    }
    m_Bool = TRUE; //获得端口默认设置
    DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    bTemp = ::GetCommState(m_Handle,&dcb);
    if (!bTemp)
    {
    iErr = ::GetLastError();
    return TRUE;
    }
    //设置通信端口
    dcb.BaudRate = CBR_9600; // 波特率为9600
    dcb.ByteSize = 8; // 数据为8位
    dcb.StopBits = ONESTOPBIT; // 停止位为1
    dcb.Parity = NOPARITY; // 无奇偶校验
    dcb.fBinary = TRUE; //允许2进制模式
    bTemp = ::SetCommState(m_Handle,&dcb);
    if (!bTemp)
    {
    iErr = ::GetLastError();
    return TRUE;
    } //设置端口超时时长
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 1000; // 1秒
    ::SetCommTimeouts(m_Handle,&CommTimeOuts); bTemp = ::PurgeComm(m_Handle,PURGE_TXCLEAR); //清发送缓冲区
    if (!bTemp)
    {
    iErr = ::GetLastError();
    }
    bTemp = ::PurgeComm(m_Handle,PURGE_RXCLEAR); //清接收缓冲区
    if (!bTemp)
    {
    iErr = ::GetLastError();
    } BOOL bTemp;
    DWORD iErr;
    OVERLAPPED OverlappedRead;
    DWORD dTemp; OverlappedRead.hEvent = ::CreateEvent(
    NULL,
    TRUE, //人工复位
    FALSE,
    NULL);
    if (OverlappedRead.hEvent == NULL)
    {
    iErr = ::GetLastError();
    MessageBox(LPCTSTR("事件初始化失败"));
    return;
    } char* lpBuffer;
    DWORD nNumberOfBytesToRead; 
    DWORD nNumberOfBytesRead; lpBuffer = new char[1024];
    nNumberOfBytesToRead = 1024;
    bTemp = ::ReadFile(
    m_Handle,
    lpBuffer,
    nNumberOfBytesToRead,
    &nNumberOfBytesRead,
    &OverlappedRead); if (!bTemp)
    {
    iErr = ::GetLastError();
    if (iErr != ERROR_IO_PENDING)
    {
    ::CloseHandle(OverlappedRead.hEvent);
    return;
    }
    dTemp = ::WaitForSingleObject(
    OverlappedRead.hEvent,
    TIMEOUT);
    if (dTemp == WAIT_FAILED)
    {
    ::CloseHandle(OverlappedRead.hEvent);
    return;
    }
    if (dTemp == WAIT_TIMEOUT)
    {
    ::CloseHandle(OverlappedRead.hEvent);
    return;
    }
    ::ResetEvent(OverlappedRead.hEvent);
    }
    ::CloseHandle(OverlappedRead.hEvent); lpBuffer[nNumberOfBytesRead] = NULL;
    m_ReadMsg = (CString)lpBuffer;
    UpdateData(FALSE); if (lpBuffer != NULL)
    {
    delete lpBuffer;
    lpBuffer = NULL;
    }
      

  3.   

    用MS COMMUNICATION CONTROL控件,它的函数帮助在打开COMPONENT AND CONTROLS 对话框的
    MORE INFORMATION 中有详细的介绍,大概过程是:打开串口-初始化-读数据;具体看有关的文
    章吧。读串口数据一般用事件驱动函数来做,类似单片机中的中断响应。
    数据库如果用ACCESS文件,选择ODBC是比较方便的。如果用SQL SERVER,个人更倾向于DBLIBRARY。