[問題] VC++寫RS232通訊
看板C_and_CPP (C/C++)作者bn01134053 (如沐春風進入語音)時間15年前 (2010/11/07 00:40)推噓0(0推 0噓 1→)留言1則, 1人參與討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
我用VC寫一個Dialog程式,希望藉由按下一個按鈕就可以由rs232接收訊號。
再測試過程中我以m_static_val.Format測試我的程式碼,假使沒有連上終
端機則會出現我設定的字串,如果有就不會出現,經過執行程式後,我的
對話盒沒有任何的反應,我現在不知道是沒有連上rs232還是有連上但讀取
的程式寫錯。煩請大大們指教
希望得到的正確結果:
能夠由終端機打字,我的對話盒接收字串
程式跑出來的錯誤結果:
沒有任何反應
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
VC++
有問題的code: (請善用置底文標色功能)
HANDLE hComm;
hComm = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (hComm == INVALID_HANDLE_VALUE)
{
int a=12;
m_static_val.Format("%f",a);
}
//串口配置
DCB dcb;
FillMemory(&dcb, sizeof(dcb), 0);
if (!GetCommState(hComm, &dcb))
{
int a=12;
m_static_val.Format("%f",a);
}
else
{
dcb.BaudRate = CBR_9600 ;
dcb.fOutX=TRUE;
dcb.fInX=TRUE;
}
if (!SetCommState(hComm, &dcb))
{
int a=12;
m_static_val.Format("%f",a);
}
//讀取
DWORD dwRead;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};
LPVOID lpBuf[1024];
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL)
m_static_val.Format("%f",11);
if (!fWaitingOnRead) {
if (!ReadFile(hComm,lpBuf, 1024, &dwRead, &osReader)) {
if (GetLastError() != ERROR_IO_PENDING)
{
int a=12;
m_static_val.Format("%f",a);
}
else
{
fWaitingOnRead = TRUE;
}
}
else {
}
}
//列出訊習
#define READ_TIMEOUT 500
DWORD dwRes;
if (fWaitingOnRead) {
dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT);
switch(dwRes)
{
case WAIT_OBJECT_0:
if (!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE))
m_static_val.Format("%f",11);
else
fWaitingOnRead = FALSE;
break;
case WAIT_TIMEOUT:
break;
default:
break;
}
}
//串口狀態
DWORD dwCommEvent;
char chRead;
if (!SetCommMask(hComm, EV_RXCHAR))
{
}
for ( ; ; ) {
if (WaitCommEvent(hComm, &dwCommEvent, NULL)) {
do {
if (ReadFile(hComm, &chRead, 1, &dwRead, NULL))
{
m_static_val.Format("%f",11);
}
else
m_static_val.Format("%f",11);
break;
} while (dwRead);
}
else
m_static_val.Format("%f",11);
break;
}
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 20;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.ReadTotalTimeoutConstant = 100;
timeouts.WriteTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(hComm, &timeouts))
{
m_static_val.Format("%f",11);
}
補充說明:
此段程式碼我是寫在BUTTON的處理事件裡面,處理事件之狀態為
點一下滑鼠左鍵就執行資料傳輸。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.230.126.120
→
11/07 01:04, , 1F
11/07 01:04, 1F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章