VC 串列埠通訊實現方式

2021-07-11 08:33:26 字數 4206 閱讀 2823

利用師姐qt2440開發板控制機械臂, 串列埠通訊出現問題, 找到usb轉串列埠後,任然找不到相應的驅動。初步打算用微控制器實現。

1.基於active控制項的方式(mscomm)

優點是:直接利用控制項,在串列埠有資料到達時,會促發相應的事件響應函式,然後你可以在實踐響應函式裡,進行資料的讀取。

缺點是:資料在傳送和接受的過程中variant、   colesafearray 型別的轉換,顯得繁瑣。

步驟:①插入控制項

選擇project選單下add to project子選單中的 components and controls…選項,在彈出的對話方塊中雙擊registered activex controls項,則所有註冊過的activex控制項出現在列表框中。 選擇microsoft communications control, version 6.0,單擊insert按鈕將它插入到我們的project中來,接受預設的選項。這時在classview視窗中就可以看到cmscomm類了,並且在控制項工具欄controls中出現了**圖示,現在要做的是用滑鼠將此圖示拖到對話方塊中,程式執行後,這個圖示是看不到的。

②為拖入對話方塊的 cmscomm控制項新增對應的控制變數 m_ctrlcomm。

③新增對應的訊息響應函式oncomm()

開啟classwizard->message maps,選擇類cscommtestdlg,選擇idc_mscomm1,雙擊訊息oncomm,將彈出的對話方塊中將函式名改為oncomm,這個函式是用來處理串列埠訊息事件的,如每當串列埠接收到資料,就會產生乙個串列埠接收資料緩衝區中有字元的訊息事件,我們剛才新增的函式就會執行,我們在oncomm()函式加入相應的處理**就能實現自已想要的功能了。請你在函式中加入如下**:

[cpp]view plain

copy

void

cscommtestdlg::oncomm()   

}  updatedata(false); //更新編輯框內容

}  

④.開啟串列埠和設定串列埠引數

現在我們在主對話方塊的cscommtestdlg::oninitdialog()開啟串列埠,加入如下**:

[cpp]view plain

copy

// todo: add extra initialization here

if(m_ctrlcomm.getportopen())  

m_ctrlcomm.setportopen(false);  

m_ctrlcomm.setcommport(1); //選擇com1

if( !m_ctrlcomm.getportopen())  

m_ctrlcomm.setportopen(true);//開啟串列埠

else

afxmessagebox("cannot open serial port"

);  

m_ctrlcomm.setsettings("9600,n,8,1"

); //波特率9600,無校驗,8個資料位,1個停止位

m_ctrlcomm.setinputmodel(1); //1:表示以二進位制方式檢取資料

m_ctrlcomm.setrthreshold(1);   

//引數1表示每當串列埠接收緩衝區中有多於或等於1個字元時將引發乙個接收資料的oncomm事件

m_ctrlcomm.setinputlen(0); //設定當前接收區資料長度為0

m_ctrlcomm.getinput();//先預讀緩衝區以清除殘留資料

⑤.傳送資料

[cpp]view plain

copy

cstring m_send = _t(

"你想要傳送的資料"

)  m_ctrlcomm.setoutput(colevariant(m_send ));  

2.基於win32 api的串列埠讀寫

①初始化開啟串列埠

優點:設定、使用更加靈活,因為是基於win32的api函式。所以顯得更加通用,適用任何windows程式上引用,不僅僅限於mfc.

缺點:需要主動的去讀取串列埠上的資料,沒有事件通知。

這裡有一點需要注意的是,當com號大於10的時候,會出現開啟錯誤,一般解決的辦法是修改com的名稱讓它的com號是一位數。除此之外也有其他解決辦法,見網上。

[cpp]view plain

copy

handle

initcom(

char

* comname)  

setupcomm(hcom,100,100); //輸入緩衝區和輸出緩衝區的大小都是100

commtimeouts timeouts;  

//設定讀超時

timeouts.readintervaltimeout=maxdword;  

timeouts.readtotaltimeoutmultiplier=0;  

timeouts.readtotaltimeoutconstant=0;  

//在讀一次輸入緩衝區的內容後讀操作就立即返回,

//而不管是否讀入了要求的字元。

//設定寫超時

timeouts.writetotaltimeoutmultiplier=100;  

timeouts.writetotaltimeoutconstant=500;  

setcommtimeouts(hcom,&timeouts); //設定超時

dcb dcb;  

getcommstate(hcom, &dcb);  

dcb.baudrate=115200; //波特率為9600

dcb.bytesize=8; //每個位元組有8位

dcb.parity=noparity; //無奇偶校驗位

dcb.stopbits=1; //兩個停止位

setcommstate(hcom, &dcb);  

purgecomm(hcom, purge_txclear|purge_rxclear);  

return

hcom;  

}  

②讀串列埠資訊

[cpp]view plain

copy

intreaddata(

handle

handler, 

char

* buffer)  

strcpy(buffer, readbuffer);  

purgecomm(handler, purge_txabort | purge_rxabort | purge_txclear | purge_rxclear);    

return

0;  

}  

③寫串列埠資訊

[cpp]view plain

copy

intwritedata(

handle

handler, 

char

* buffer)  

return

0;  

}

switch(arm_type)

setcommstate(hcom, &com_config_back);

closehandle(hcom);

}if(i==max_com_num)

armctr = (arm_controller*)malloc(sizeof(*armctr));

armctr->arm_com = hcom;

break;

case arm_device_virtual_std:

armctr = (arm_controller*)malloc(sizeof(*armctr));

armctr->arm_com=null;

//armctr->arm_com=-1;

break;

default:

return null;

} armctr->arm_type = arm_type;

printf("連線到串列埠裝置:%s\n",comstr);

return armctr;

}

串列埠通訊實現

前段時間編寫了串列埠通訊的 用的是rs 232資料線 include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include include include include define dev dev ttys1 d...

串列埠通訊實驗

晶振12mhz,波特率1200,程式啟動後微控制器主動發出hello server,pc使用串列埠助手應答微控制器,當微控制器收到pc發來的資料aah後,將30h 3fh的16個位元組傳送給pc,當51收到e0h時就發40h 5fh的32個位元組資料,若微控制器收到其他資料後,則不做任何修改返回pc...

串列埠通訊實戰

start.s 檔名 start.s 描述 演示串列埠通訊 define wtcon 0xe2700000 define svc stack 0xd0037d80.global start 把 start鏈結屬性改為外部,這樣其他檔案就可以看見 start了 start 第1步 關看門狗 向wtco...