激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月


主題:串口通訊線程問題

  共有43911人關注過本帖    
帥哥喲,離線,有人找我嗎?
bingdongcha
1樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
串口通訊線程問題  發(fā)帖心情 Post By:2013-5-21 22:30:00   [只看該作者]

DWORD WINAPI CCESerial::ReceiveThreadFunc(LPVOID lparam)
{
CCESerial *lpSerial = (CCESerial*)lparam;
DWORD     dwEvtMask, dwReadError;
COMSTAT  cmStat;
ULONG     nWillLen;


SetCommMask( lpSerial->m_hSer, EV_RXCHAR|EV_ERR  );
for( ; ; )
{
printf( "WRITE WRITE WRITE WRITE CHAR  \r\n");
/************************************************************************************************
// if( WaitCommEvent( lpSerial->m_hSer, &dwEvtMask, NULL ) )
// {
// SetCommMask( lpSerial->m_hSer, EV_RXCHAR|EV_ERR );
// // get how many data available in receive buffer
// if( dwEvtMask & EV_RXCHAR )
// {
// ClearCommError( lpSerial->m_hSer, &dwReadError, &cmStat ); //取接收數(shù)據(jù)長度信息
// nWillLen = cmStat.cbInQue;
// if( nWillLen <=0 )
// continue;
//
// lpSerial->m_lDatLen = 0;
// ReadFile( lpSerial->m_hSer, lpSerial->DatBuf, nWillLen, &lpSerial->m_lDatLen, 0 );
//
// if( lpSerial->m_lDatLen>0 )
// {
// // 調用回調函數(shù)處理接收到的數(shù)據(jù)
// lpSerial->OnReceive( );
// }
// }
// else if( dwEvtMask & EV_ERR )
// {
// // 清錯誤標志
// ClearCommError( lpSerial->m_hSer, &dwReadError, &cmStat );
// lpSerial->OnError( );
// }
//
// }
//
// if( WaitForSingleObject( lpSerial->m_hKillRxThreadEvent, 0 ) == WAIT_OBJECT_0)
// {
// SetEvent( lpSerial->m_hReceiveCloseEvent );
// break;
// }
*************************************************************************************************/
}
return 0;
}


上邊這個線程  可以循環(huán)打印,但是把注釋的部分打開,只能運行一次打印。好像是線程只運行了一次。
在if( WaitCommEvent( lpSerial->m_hSer, &dwEvtMask, NULL ) )設置斷點,暫停后也不能單步運行。按單步也直接就啟動了。
是和WaitCommEvent( lpSerial->m_hSer, &dwEvtMask, NULL ) 這個函數(shù)有關系么??

串口打開時是異步通信方式-非阻塞方式打開的。
m_hComm = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); // 異步通信方式-非阻塞方式

或者有跟好的方法實現(xiàn)在線程內(nèi)實現(xiàn)收發(fā)數(shù)據(jù)。主要想做循環(huán)式通訊規(guī)約。

[此貼子已經(jīng)被作者于2013-5-21 22:39:56編輯過]

  單帖管理 | 引用 | 回復 回到頂部
帥哥喲,離線,有人找我嗎?
lqk
2樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
  發(fā)帖心情 Post By:2013-5-22 9:41:00   [只看該作者]

WINCE不支持重疊I/O模式,所以不能使用FILE_FLAG_VOERLAPPED參數(shù)。
WaitCommEvent總是阻塞等待數(shù)據(jù)接收。
通訊規(guī)約一般有固定的格式,需要根據(jù)通訊規(guī)約將接收數(shù)據(jù)在本地緩存處理,然后根據(jù)接收數(shù)據(jù)的內(nèi)核,做相應的應答。

  單帖管理 | 引用 | 回復 回到頂部
帥哥喲,離線,有人找我嗎?
bingdongcha
3樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
  發(fā)帖心情 Post By:2013-5-24 11:27:00   [只看該作者]

現(xiàn)在是這樣實現(xiàn)的,把代碼貼出來,童鞋們可以借鑒,老鳥們批判下。我繼續(xù)改正。
電力規(guī)約循環(huán)發(fā)送CDT報文,串口沒有用重疊I/O模式,線程啟動前先發(fā)送一個字節(jié),觸發(fā)EV_TXEMPTY事件。以后就可以循環(huán)發(fā)送了,串口有數(shù)據(jù)來時,也可以接受處理。
最后的一句Sleep();加上它,報文會有卡頓。不加Sleep();這個線程一直在運行,不知道長時間運行對其他線程是否會有影響。暫時測試沒有影響,所以把Sleep();封掉了。
DWORD WINAPI CDTSend(PVOID lparam)
{
PVOID lpflag;
lpflag = lparam;



DWORD dwEvtMask, dwReadError;
COMSTAT cmStat;
ULONG nWillLen;
unsigned char buf = 0xff;

BOOL bReadStatus;
cdt_tx0.OpenPort(CDTA_Port,CDTA_Bate,CDTA_Pn,8,1);
SetCommMask(cdt_tx0.m_hComm, EV_RXCHAR|EV_ERR|EV_TXEMPTY);
cdt_tx0.WritePort(&buf,1);
while(TRUE)
{
// 阻塞串口時間 一直等待事件發(fā)生。
if(WaitCommEvent(cdt_tx0.m_hComm, &dwEvtMask, NULL))
{
SetCommMask(cdt_tx0.m_hComm, EV_RXCHAR|EV_ERR|EV_TXEMPTY);
if( dwEvtMask & EV_RXCHAR )
{
printf( "CDT_TX0 RECV RECV SUCCESS  \r\n");
ClearCommError( cdt_tx0.m_hComm, &dwReadError, &cmStat ); //取接收數(shù)據(jù)長度信息
nWillLen = cmStat.cbInQue; // cbInQue:表示接收緩沖區(qū)中存儲的待ReadFile讀取的字節(jié)數(shù)。
// cbOutQue:表示發(fā)送緩沖區(qū)中存儲的待發(fā)送的字節(jié)數(shù)。
if( nWillLen <=0 )
continue;

cdt_tx0.RecvLen = 0;
bReadStatus = ReadFile(cdt_tx0.m_hComm, cdt_tx0.AcceBuf, nWillLen, &cdt_tx0.RecvLen, NULL);
if(cdt_tx0.RecvLen > 0)
cdt_tx0.Acces(cdt_tx0.AcceBuf,cdt_tx0.RecvLen);
}
if(dwEvtMask & EV_TXEMPTY)
{
cdt_tx0.WritePort(cdt_tx0.SendBuf,cdt_tx0.SendLen);
}
else if(dwEvtMask & EV_ERR)
{
// 清錯誤標志
ClearCommError(cdt_tx0.m_hComm, &dwReadError, &cmStat);
}

}
// Sleep(99); // 線程掛起時間99MS  調度時間1MS  線程重新運行時間100MS
}
return 0;

}

  單帖管理 | 引用 | 回復 回到頂部
帥哥喲,離線,有人找我嗎?
lqk
4樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
  發(fā)帖心情 Post By:2013-5-24 13:12:00   [只看該作者]

數(shù)據(jù)的接收和發(fā)送完全可以由兩個線程來分別完成,在我們網(wǎng)站上有一篇基于RS485的電力系統(tǒng)DL645協(xié)議規(guī)約的實現(xiàn)方法http://www.huochepiao123.com.cn/article/article2009326.html,可以做為一個例子參考。
如果需要源碼,請留下郵箱。

  單帖管理 | 引用 | 回復 回到頂部
帥哥喲,離線,有人找我嗎?
bingdongcha
5樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
  發(fā)帖心情 Post By:2013-5-24 15:35:00   [只看該作者]

我們也做645規(guī)約。
gyangchina@163.com這是我的郵箱,感謝共享源碼。
萬分感謝。

  單帖管理 | 引用 | 回復 回到頂部
帥哥喲,離線,有人找我嗎?
lqk
6樓 信息 | 搜索 | 郵箱


加好友 發(fā)短信
  發(fā)帖心情 Post By:2013-5-24 17:16:00   [只看該作者]

例程已發(fā)到你郵箱,請查收。

  單帖管理 | 引用 | 回復 回到頂部

返回首頁

串口通訊線程問題

用戶名:
            驗證碼: 驗證碼,看不清楚?請點擊刷新驗證碼
內(nèi)容:
主站蜘蛛池模板: 成人激情视频在线观看| 一级aa毛片| 国产精品黄页网站在线播放免费| 国产一区亚洲二区三区| 11111日本网站| 亚洲人视频在线观看| 免费观看a毛片一区二区不卡| 黄色一级片播放| 99国产精品| 嫩草影院在线入口| 亚洲国产成人久久一区久久| 三级毛片三级毛片| 日韩午夜激情视频| 亚洲国产二区三区久久| 成年人黄色片网站| 欧美一级毛片黄| 国产69页| 国产毛片a| 国产真实强j视频在线观看| 爱爱欧美| 黄色动作视频| 国产福利一区二区麻豆| 日韩精品一区二区三区不卡| av播播| 久久精品影院一区二区三区| 黄色一级视频网| asian极品呦女69| 丁香五月亚洲综合在线| 国产精品宅男在线观看| 日韩欧美成人乱码一在线| 亚洲精品成人456在线播放| 亚洲综合精品| 最近中国免费高清观看| 久久线看观看精品香蕉国产| 日韩不卡毛片| 日本高清xxxx免费视频| 在线成人| 亚洲国产精品免费视频| 亚洲美女一级毛片| 亚洲国产二区三区| 亚洲成a人片在线播放观看国产|