寫的程式中用到了CSerialPort類來實作串口資料的讀寫。現打算實作這樣一個功能:上位機回圈不斷的發指令到下位機(上下位機通過無線數傳電臺連到串口進行通信),下位機收到后回傳應答,上位機收到應答后停止發送。
我現在在發送的命令按鈕里用CSerialPort類的writetoport()方法可實作一次寫,但放在回圈里,重復寫,應用程式有時就不回應其他動作。
想到的解決方法是,在命令按鈕里創建一個執行緒,在執行緒處理函式中寫一個回圈,回圈體為CSerialPort類的writetoport()方法。但碰到的問題是,一運行就提示:該記憶體不能讀,不能寫等錯誤。
請教各位:如何在執行緒中呼叫CSerialPort類的writetoport()方法?或有沒有別的解決方法。謝謝!
uj5u.com熱心網友回復:
僅供參考:#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
struct tm *now;
struct timeb tb;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,s);
}
VOID CALLBACK myTimerProc1(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc1\n");
}
VOID CALLBACK myTimerProc2(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
) {
log("In myTimerProc2\n");
}
int main() {
int i;
MSG msg;
SetTimer(NULL,0,1000,myTimerProc1);
SetTimer(NULL,0,2000,myTimerProc2);
for (i=0;i<20;i++) {
Sleep(500);
log("In main\n");
if (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
//2012-07-26 17:29:06.375 In main
//2012-07-26 17:29:06.875 In myTimerProc1
//2012-07-26 17:29:07.375 In main
//2012-07-26 17:29:07.875 In myTimerProc2
//2012-07-26 17:29:08.375 In main
//2012-07-26 17:29:08.375 In myTimerProc1
//2012-07-26 17:29:08.875 In main
//2012-07-26 17:29:08.875 In myTimerProc1
//2012-07-26 17:29:09.375 In main
//2012-07-26 17:29:09.890 In myTimerProc2
//2012-07-26 17:29:10.390 In main
//2012-07-26 17:29:10.390 In myTimerProc1
//2012-07-26 17:29:10.890 In main
//2012-07-26 17:29:10.890 In myTimerProc1
//2012-07-26 17:29:11.390 In main
//2012-07-26 17:29:11.890 In myTimerProc2
//2012-07-26 17:29:12.390 In main
//2012-07-26 17:29:12.390 In myTimerProc1
//2012-07-26 17:29:12.890 In main
//2012-07-26 17:29:12.890 In myTimerProc1
//2012-07-26 17:29:13.390 In main
//2012-07-26 17:29:13.890 In myTimerProc2
//2012-07-26 17:29:14.390 In main
//2012-07-26 17:29:14.390 In myTimerProc1
//2012-07-26 17:29:14.890 In main
//2012-07-26 17:29:14.890 In myTimerProc1
//2012-07-26 17:29:15.390 In main
//2012-07-26 17:29:15.890 In myTimerProc2
//2012-07-26 17:29:16.390 In main
//2012-07-26 17:29:16.390 In myTimerProc1
//2012-07-26 17:29:16.890 In main
//2012-07-26 17:29:16.890 In myTimerProc1
//2012-07-26 17:29:17.390 In main
//2012-07-26 17:29:17.890 In myTimerProc2
//2012-07-26 17:29:18.390 In main
//2012-07-26 17:29:18.390 In myTimerProc1
//2012-07-26 17:29:18.890 In main
//2012-07-26 17:29:18.890 In myTimerProc1
//2012-07-26 17:29:19.390 In main
//2012-07-26 17:29:19.890 In myTimerProc2
uj5u.com熱心網友回復:
Debug版本除錯運行,出現錯誤提示時重試運行,結合呼叫堆疊,修改代碼uj5u.com熱心網友回復:
上位機回圈不斷的發指令到下位機,用定時器,定時器那里處理是否收到應答,收到關閉定時器,否則發指令uj5u.com熱心網友回復:
也可以使用這幾個API函式:createFile 打開串口。setcommstate設定串口。readfile讀串口資料。writefile寫串口資料,closefile關閉串口資料。uj5u.com熱心網友回復:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspxuj5u.com熱心網友回復:
記憶體訪問錯誤??除錯看看uj5u.com熱心網友回復:
幫你頂上去, 兄弟, 有沒有試過用該類, 生成多個物件 打開多個串口?uj5u.com熱心網友回復:
串口很簡單 貼代碼 或者我給你一個實體轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/99733.html
標籤:進程/線程/DLL
上一篇:c++ MIME 決議
下一篇:在vc環境下做影像邊緣的提取。
