亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3228 | 回復(fù): 8
打印 上一主題 下一主題

Windows與ARM2440串口通信的問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-11-19 11:38 |只看該作者 |倒序?yàn)g覽
寫了一個(gè)Windows下模擬超級(jí)終端與串口通信的程序,F(xiàn)在已經(jīng)能相互通信,但有一個(gè)問(wèn)題:每次我往串口寫入數(shù)據(jù)后,這個(gè)數(shù)據(jù)馬上會(huì)被負(fù)責(zé)讀串口的線程讀到。怎么能象超級(jí)終端里那樣讀和寫完全分開(kāi)?請(qǐng)問(wèn)怎么解決?

[ 本帖最后由 Wind-Son 于 2008-11-19 11:47 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-11-19 11:40 |只看該作者
代碼:
BOOL CComS::Connect(ComParam* p)
{
    CString name;

    ASSERT(p);

    if (m_hCom) {
        ErrMsg(IDS_ERR_COM_AREADY_OPEN);
        return FALSE;
    }

    name.Format(_T("COM%d"), p->u.Coms.ID);

    m_hCom = ::CreateFile(name,
        GENERIC_READ|GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        /*FILE_ATTRIBUTE_NORMAL|*/FILE_FLAG_OVERLAPPED,
        NULL);
    if (m_hCom == INVALID_HANDLE_VALUE) {
        ReportLastErr();
        return FALSE;
    }

    DCB LocalDCB;

    LocalDCB.DCBlength = sizeof(LocalDCB);

    if (!::GetCommState(m_hCom, &LocalDCB)) {
        ReportLastErr();
        ::CloseHandle(m_hCom);
        return FALSE;
    }

    LocalDCB.BaudRate = p->u.Coms.Baudrate;
    LocalDCB.fBinary = TRUE;
    LocalDCB.fParity = FALSE;
    LocalDCB.fOutxCtsFlow = FALSE;
    LocalDCB.fOutxDsrFlow = FALSE;
    LocalDCB.fDtrControl = DTR_CONTROL_DISABLE;//DTR_CONTROL_HANDSHAKE;

    LocalDCB.fRtsControl = RTS_CONTROL_DISABLE;//DTR_CONTROL_HANDSHAKE;

    LocalDCB.fOutX = FALSE;
    LocalDCB.fInX = FALSE;
    LocalDCB.fNull = FALSE;
    LocalDCB.fNull=FALSE;
    LocalDCB.ByteSize = 8;
    LocalDCB.Parity = NOPARITY;
    LocalDCB.StopBits = ONESTOPBIT;
    if (!::SetCommState(m_hCom, &LocalDCB)) {
        ReportLastErr();
        ::CloseHandle(m_hCom);
        return FALSE;
    }

    DWORD err;
    if (!::ClearCommError(m_hCom, &err, NULL)) {
        ReportLastErr();
        return FALSE;
    }

    memset(&m_ComOverlap, 0, sizeof(OVERLAPPED));
    m_ComOverlap.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
    m_Event = ::CreateEvent(NULL, TRUE, FALSE, NULL);

    int byteUsedTime = 14400 / 115200 +1 + 1000;
    COMMTIMEOUTS timeouts = {20 + byteUsedTime, byteUsedTime, 1000, byteUsedTime , 20};
    SetCommTimeouts(m_hCom, &timeouts) ;
    SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY );//設(shè)置事件驅(qū)動(dòng)的類型

    SetupComm(m_hCom, 10204, 5210);
    PurgeComm(m_hCom, PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

    InitializeCriticalSection(&m_Critical);

    return TRUE;
}

BOOL CComS::Disconnect()
{
    DWORD err;

    if (!::ClearCommError(m_hCom, &err, NULL))
        ReportLastErr();
    if (!::CloseHandle(m_hCom))
        ReportLastErr();
    SetEvent(m_ComOverlap.hEvent);
    Sleep(100);
    if (!::CloseHandle(m_ComOverlap.hEvent))
        ReportLastErr();
    if (!::CloseHandle(m_Event))
        ReportLastErr();
    m_hCom = NULL;
    return TRUE;
}


論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-11-19 11:41 |只看該作者
沒(méi)明白問(wèn)題在哪里

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-11-19 11:42 |只看該作者
代碼2:
BOOL CComS::Send(LPBYTE pBuf, int len, DWORD MaxTime)
{
    BOOL ret = FALSE;
    OVERLAPPED overlap;

    ASSERT(m_hCom != NULL);
    ASSERT(len < 2000);

    DWORD written = 0;

    SetEvent(m_ComOverlap.hEvent);

    memset(&overlap, 0, sizeof(OVERLAPPED));
    overlap.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);

    EnterCriticalSection(&m_Critical);

    BYTE Buf[100] = "rbbttqqyybb";
    //if (!::WriteFile(m_hCom, Buf, 10, &written, &overlap)) {

    if (!::WriteFile(m_hCom, pBuf, len, &written, &overlap)) {
        if (::GetLastError() == ERROR_IO_PENDING) {
            if (::WaitForSingleObject(overlap.hEvent, MaxTime) == WAIT_OBJECT_0) {
                if (!GetOverlappedResult(m_hCom, &overlap, &written, FALSE))
                    ReportLastErr();
                ret = TRUE;
            }
        }
    } else {
        ret = TRUE;
    }

    if (!::CloseHandle(overlap.hEvent))
        ReportLastErr();

    LeaveCriticalSection(&m_Critical);

    return ret;
}

DWORD CComS::Receive(LPBYTE pDestBuf, int length, DWORD MaxTime)
{
#define RX_BUF_LEN    10000
    static BYTE buffer[RX_BUF_LEN];
    static int curOut = -1, curLen = 0;
    int tmp, len;

    ASSERT(m_hCom != NULL);
    ASSERT(length < 2000);

    tmp = length;
   
    if (curLen) {
        len = min(length, curLen);
        memcpy(pDestBuf, &buffer[curOut], len);
        length -= len;
        pDestBuf += len;
        curOut += len;
        curLen -= len;
        if (length == 0)
            return len;
    }
    ASSERT(curLen == 0);

    EnterCriticalSection(&m_Critical);

    DWORD dwEvtMask = 0;
    OVERLAPPED os;
    memset(&os, 0, sizeof(OVERLAPPED));
    os.hEvent = m_Event;
    ResetEvent(m_Event);
    SetCommMask(m_hCom, EV_RXCHAR|EV_TXEMPTY);

    COMSTAT ComStat;
    DWORD dwLength, dwErrorFlags, dwBytesRead;
    if (!WaitCommEvent(m_hCom, &dwEvtMask, &os)) {
        if (::WaitForSingleObject(m_ComOverlap.hEvent, 0) == WAIT_OBJECT_0) {
            ResetEvent(m_ComOverlap.hEvent);
            goto out;
        }
        if (GetLastError() != ERROR_IO_PENDING)
            goto out;
        if (::WaitForSingleObject(m_Event, 300) == WAIT_OBJECT_0) {
            if (!GetOverlappedResult(m_hCom, &os, &dwBytesRead, FALSE)) {
                ReportLastErr();
                goto out;
            }
            //break;

        }
        //dwEvtMask = 0;

    }

    if (dwEvtMask & EV_TXEMPTY) {
        //PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_TXABORT);

        goto out;
    }

    if (!(dwEvtMask & EV_RXCHAR))
        goto out;
   
    ClearCommError(m_hCom, &dwErrorFlags, &ComStat) ;
    dwLength = ComStat.cbInQue;
    if (dwLength > 0) {               
        ResetEvent(os.hEvent);
        ASSERT(dwLength <= RX_BUF_LEN);
        if (!ReadFile(m_hCom, buffer, dwLength,
            &dwBytesRead, &os)) {
            ReportLastErr();
        }
        //GetOverlappedResult(m_hCom, &os, &dwBytesRead, TRUE);

        len = min((int)dwBytesRead, length);
        memcpy(pDestBuf, buffer, len);
        curLen = dwBytesRead - len;
        curOut = len;
        length -= len;            
    }

out:
    LeaveCriticalSection(&m_Critical);
    return tmp - length;
}

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-11-19 11:45 |只看該作者
原帖由 eveson 于 2008-11-19 11:41 發(fā)表
沒(méi)明白問(wèn)題在哪里

本來(lái)應(yīng)該是接收線程只可以讀到從開(kāi)發(fā)板發(fā)上來(lái)的數(shù)據(jù)(上行數(shù)據(jù)),可實(shí)際上發(fā)送到板子上的數(shù)據(jù)(下行數(shù)據(jù))也被它讀到了
上行和下行的數(shù)據(jù)混到一起了

[ 本帖最后由 Wind-Son 于 2008-11-19 11:46 編輯 ]

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-11-19 14:31 |只看該作者
讀寫保護(hù)!或者雙通道,

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-11-19 16:49 |只看該作者
怎么會(huì)啊,串口應(yīng)該會(huì)有接受buffer和發(fā)送buffer的啊。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-11-19 17:04 |只看該作者
原帖由 eveson 于 2008-11-19 16:49 發(fā)表
怎么會(huì)啊,串口應(yīng)該會(huì)有接受buffer和發(fā)送buffer的啊。

我也覺(jué)得很奇怪,搞了兩天都沒(méi)解決。按理流文件發(fā)出去的數(shù)據(jù)都讀不回來(lái)才對(duì)啊

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-11-19 17:22 |只看該作者
好好檢查下代碼吧,肯定哪個(gè)地方不小心讓你寫錯(cuò)了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP