A. 求助高人:串口WriteFile出錯
不關你事的,這里它本身的bug,發送某個特定字元時會出錯(具體哪個我忘了,你用窮舉一個一個試吧),換成真正的雙機連接就不會了(不過有可能會出現其它錯誤,軟體模擬的畢竟與實際還是有點不同的)
我的解決方法是將該字元進行替換
另外,我試過一次發送多個字元,裡麵包含該字元時也沒錯,不知為什麼
出了錯不用重啟電腦的,重置串口就行了
--------------------------------------------
你的串口連接線有沒有問題?有debug的io命令試一下
--------------------------------------------
你的埠是以非同步讀寫打開的還是同步?
如果是非同步的話if(!dwWrite&&(GetLastError()==ERROR_IO_PENDING))
這里會出現個小問題,dwWrite可能永遠為假
另外,檢查一下send裡面的內容,看看裡面發送的內容是否正確
--------------------------------------------
這里我寫埠的作法
hch_Write.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WriteFile(comhandle, outbuff, 1024, &towrite, &hch_Write))
{
//HCH_TEST;
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函數返回ERROR_IO_PENDING,表明串口正在進行讀寫操作
{
//INFINITE
WaitForSingleObject(hch_Write.hEvent, 5000);
//使用WaitForSingleObject函數等待,直到寫操作完成或延時已達到5秒鍾
PurgeComm(comhandle, PURGE_TXABORT|PURGE_TXCLEAR);
--------------------------------------------
參考資料是串口調試助手的源代碼
B. 為什麼用writefile來寫串口返回值非0,寫入
先用串口調試助手之類的軟體把串口調通,波特率等設置確定好,然後再考慮自己程序的問題。
C. 串口通信程序為什麼WriteFile被阻塞
:非同步串口可以不用,同步阻塞方式必須用,否則調用readfile writefile會阻塞線程,窗口就卡死了。。。 單線程用非同步串口可以,但並不好,非同步方式,窗口界面一般你還需要用個定時器,定時來查詢通訊是否完成,何必這么麻煩,實時性又差
D. 怎麼用writefile發送位元組數組給串口
注意ReadFile()不是從你的單片機串口讀數據,它是從PC的串口讀接收到的數據,除非你的單片機給PC發了數據,你可以用ReadFile()讀出,否則,望穿了秋水也等不到單片機里的數據。
E. 用API函數編寫的串口通信,埠打開了,WriteFile總是反回調用失敗類型為0;以下是程序,我是新手,謝謝幫
我遇到同樣的問題,我用GetLastError()也是返回0,但是寫入位元組為0.請問你現在解決了嗎?如果解決了可以告訴我怎麼解決的?
F. 用WriteFile寫串口後,提示錯誤"997".問題出在哪
初步估計你項目的屬性設置的是「使用 Unicode 字元集」,所以你的CString是使用寬位元組存儲的字元串,一個字元占兩位。而WriteFile函數沒有WriteFileW的版本。 需要使用WideCharToMultiByte();做一個轉換。
G. 串口通訊程序為什麼WriteFile被阻塞
BOOL CSeriesPort::WritePort(HANDLE hc, const BYTE* buf, DWORD len)
{
DWORD wnum = 0;
DWORD hnum = 0; //已寫入了位元組
ASSERT(hc != INVALID_HANDLE_VALUE);
do
{
if(WriteFile(hc,buf + hnum,len - hnum, &wnum, NULL)) //阻塞在這里,單步執行也不行,直到接收到數據時才執行到下一步
{
hnum = hnum + wnum;
if(hnum == len)
{
break;
}
Sleep(10);
}
else
{
return FALSE;
}
} while (TRUE);
return TRUE;
}
DWORD CSeriesPort::ReadThreadFunc(LPVOID lp)
{
CSeriesPort* ps = (CSeriesPort*)lp;
DWORD evt;
BYTE* rbuf = NULL; //讀取的位元組
DWORD rLen = 0; //實際讀取的位元組
DWORD wLen;
DWORD rError;
COMSTAT cmstate;
ASSERT(ps->m_hComm != INVALID_HANDLE_VALUE);
PurgeComm(ps->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); //清空緩沖區
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);
while(TRUE)
{
if(WaitCommEvent(ps->m_hComm, &evt, 0))
{
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR); //接收到數據時WriteFile才能繼續
//串口收到字元
if(evt & EV_RXCHAR)
{
ClearCommError(ps->m_hComm, &rError, &cmstate);
wLen = cmstate.cbInQue;
if(wLen <= 0)
{
continue;
}
rbuf = new BYTE[wLen];
memset(rbuf, '\0', wLen);
ReadFile(ps->m_hComm, rbuf, wLen, &rLen, 0);
if(rLen > 0) //觸發讀事件
{
H. VC中WriteFile()函數串口編程如何確定是否正
你在本機上的一個串口用WriteFile()向另一個串口發數據,用串口調試助手在另一個串口接收,即可看到你收到的內容,從而驗證WriteFile()發送的數據是否正確。
I. 寫串口的代碼,為什麼writefile不返回
在Windows應用程序的開發中,我們常常需要面臨與外圍數據源設備通信的問題。計算機和單片機(如MCS-51)都具有串列通信口,可以設計相應的串口通信程序,完成二者之間的數據通信任務。
實際工作中利用串口完成通信任務的時候非常之多。已有一些文章介紹串口編程的文章在計算機雜志上發表。但總的感覺說來不太全面,特別是介紹32位下編程的更少,且很不詳細。筆者在實際工作中積累了較多經驗,結合硬體、軟體,重點提及比較新的技術,及需要注意的要點作一番探討。希望對各位需要編寫串口通信程序的朋友有一些幫助。