討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
COM PORT資料 讀取為亂碼(ON RX.TX)
更改我的閱讀文章字型大小
作者 : mega(mega) 人氣指數超過10000點
[ 貼文 53 | 人氣 15967 | 評價 0 | 評價/貼文 0 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/22 上午 11:10:21
要寫測試COM PORT的PIN腳: 如RX跟TX
問題1: 有用DEBUG模式去看 讀到的值是一堆亂碼
且我不懂的是 用WRITE/READFILE一次寫/讀一BYTE 但得到的往往不只1BYTE
PS:要傳送資料我是用CHAR(TCHAR之前也試過 )
很固定的是...例如說我傳的是"1234"(TCHAR格式) 亂碼就一定會是"???▋ ??????"
即使重新執行 出現的亂碼也是相同
問題2: 在DCB的設定部份(如BaudRate等) 我是參考從網路上看來的程式碼
像BaudRate 我設38400 但DEBUG時 出現的還是預設的9600
不知問題在哪?
請各位大大幫忙看看.....謝謝!


程式碼如下:
void CComTestDlg::OnRxTxTest()
{
// TODO: Add your control notification handler code here
// m_ComPortControl.GetWindowText(m_ComPortName);
// hComPort = CreateFile(m_ComPortName, GENERIC_READ |GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

DCB dcb;
COMMTIMEOUTS TimeOut;
    TimeOut.ReadIntervalTimeout = 0;
    TimeOut.ReadTotalTimeoutMultiplier = 0;
    TimeOut.ReadTotalTimeoutConstant = 1000; //(總讀取 time out 時間 = 0.5 秒)
    TimeOut.WriteTotalTimeoutMultiplier = 0;
    TimeOut.WriteTotalTimeoutConstant = 1000; //(總寫入 time out 時間 = 0.5 秒)

    dcb.DCBlength = sizeof(DCB);
    GetCommState(hComPort,&dcb);
    dcb.BaudRate = 38400; // baud
    dcb.ByteSize = 8; // Number of bits/byte, 4-8
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;

OVERLAPPED OverlapRead;
OVERLAPPED OverlapWrite;
memset(&OverlapRead, 0, sizeof(OVERLAPPED));
memset(&OverlapWrite, 0, sizeof(OVERLAPPED));

COMSTAT ComStat;
m_ComPortControl.GetWindowText(m_ComPortName);
hComPort = CreateFile(m_ComPortName, GENERIC_READ |GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL);
if(hComPort == INVALID_HANDLE_VALUE)
{
MessageBox("Can't open " + m_ComPortName,_T("Error"), MB_ICONERROR);
}

if (SetCommState(hComPort,&dcb)) //(存放執行CreatFile函數後所傳回的HANDLE代碼,指向 DCB 資料結構的位址)
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set COMMState is success!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}
    else
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set COMMState is fail!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}

    if (SetupComm(hComPort,1024,1024)) //(同上,輸入資料佇列大小,輸出資料佇列大小)
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set up Comm is success!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}
    else
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set up Comm is fail!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}

  
if (SetCommTimeouts(hComPort,&TimeOut))
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set Comm Timeout is success!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}
    else
{
m_ListControl.InsertString(m_ListControl.GetCount(), TEXT("Set Comm Timeout is fail!"));
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
}

TCHAR tWrite[127]=_T("1234");
TCHAR tRead[127];
DWORD dwBytesWritten;
BOOL bWriteState;

if(1)
{
//ClearCommError(hComPort, NULL, &ComStat);
PurgeComm(hComPort, PURGE_RXCLEAR | PURGE_TXCLEAR);
bWriteState=WriteFil(hComPort,&tWrite,1,&dwBytesWritten,NULL); //lstrlen (tWrite)*sizeof(TCHAR)
Sleep(300);//lstrlen(tRead)*sizeof(TCHAR)
bWriteState=ReadFile(hComPort, &tRead,1,&dwBytesWritten,NULL);
//pRtsCtsTest->SetWindowText((const unsigned short *)tRead);
m_ListControl.InsertString(m_ListControl.GetCount(), tRead);
m_ListControl.SetCurSel(m_ListControl.GetCount() - 1);
};
CloseHandle(hComPort);
}
作者 : sakon(sakon)
[ 貼文 91 | 人氣 1 | 評價 240 | 評價/貼文 2.64 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/10/25 上午 09:08:58
我最近才寫完一個多緒的comm port測試軟體,我有遇到你講的第一個問題:

你設的讀取和寫出的buffer 都是1024,由於讀取的資料不見都是1024,所以你去看你的讀取buffer,會是不可預知的資料,所以你要加一個動作,ReadFile 讀取完會給個已讀取多少的字元的回傳值,你必須依那個值自己輸出資料.

你可以查MSDN,裡面有個多緒的win32 sdk comm port範例程式,標題是Serial Communications in Win32,我自己把它封裝成class,我是建議你不要用一般的輪詢,會有資料讀取漏失的問題.
 板主 : 徵求中
 > COM/DCOM - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - COM/DCOM - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
COM/DCOM
1 估得 490 
2 nick 120 
3 PLAYER 110 
4 天雲 100 
5 Raynor 80 
6 青衫 60 
7 60 
8 Peter.huang 50 
9 酷小毅 50 
10 Giant 50 
COM/DCOM
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875