C MFC 串列埠通訊 光源控制器控制

2021-10-09 06:02:59 字數 3704 閱讀 1131

一.背景

1、平台

vs2010+mfc+64位編譯平台+使用 unicode 字符集

2、 字元、字word、位元組byte、位bit

(1)字元是指計算機中使用的字母、數字、字和符號。

(2)1word=2bytes=8bits

(3)開發是在vs2010下做的,預設字符集編碼是unicode,但在之前的工程中,預設的字符集形式是多位元組字符集。

cstring屬於所謂的寬字符集,乙個字元佔兩個位元組;char型別屬於窄字符集,乙個char字元佔乙個位元組,所以它們之間的轉換涉及到位元組大小的轉換。cstring預設採用unicode編碼,而char採用ansi編碼,兩種編碼中單個字元佔的儲存大小也是不同的。

假設正常com接收的資料為:23 33 31… 如果直接用cstring,接收到的資料為23 00 33 00…

需要進行轉化:unicode 下 cstring 轉 char* 的方法

3、光源控制器的硬體規範&資料格式(幀格式)

波特率資料長度

停止位奇偶校驗

9600 bps

8 bits

1 bit無

1位元組1位元組

1位元組3位元組

2位元組特徵字

命令字通道字

資料異或和校驗字

(1)特徵字 = #

(2)命令字 = 1,2,3,4,分別定義為:開啟對應通道亮度,關閉對應通道亮度,設定對應通道亮度引數,讀出對應通道亮度引數。

當命令字為1,2,3時,如控制器接收命令成功,則返回特徵字$;如控制器接收命令失敗,則返回&。

當命令字為4時,如控制器接收命令成功,則返回對應通道的亮度設定引數(返回格式跟傳送格式相同);如控制器接收命令失敗,則返回&。

(3) 通道字 = 1,2,3,4。分別代表4個輸出通道。

(4)資料 = 0xx(xx=00~ff內的任一數值),對應通道電源的設定引數,轉化為十進位制為0~255。

(5)異或和校驗字 = 除校驗字外的位元組(包括:特徵字,命令字,通道字和資料)的異或校驗和

4、串列埠通訊常用api

二.程式

1、定義全域性變數

handle hcom1;

//光源所在串列埠

// 用於重疊讀

// 用於重疊寫

bool open_comport1,light1_openorclose=

false

;//是否成功開啟串列埠,是否開啟光源

2、串列埠初始化

hcom1 =

createfile

(l"com2"

,generic_read | generic_write,0,

null

,open_existing ,file_attribute_normal,

null);

if(hcom1 == invalid_handle_value)

else

3、串列埠通訊函式

//傳送指令並讀取返回值,senddata(createstr(3,1,50)),指令字為4時更新顯示框

bool c光源控制dlg::

senddata

(cstring data)

//接收反饋

sleep

(100);

int c=0;

for( c=

0;c<

10;c++

)else

}else

//多個代表命令4,讀取亮度值

else

}break;}

sleep(15

);}if

(c>=10)

return

true;}

//輸入命令字、通道和亮度值(3,1,50修改通道1亮度->50),輸出命令語句# 3 1 032 17

cstring c光源控制dlg::

createstr

(byte command,byte channle,byte data)

else

temp2=conhex;

returnstr=returnstr+temp2;

//把所有的字元異或運算,+異或和校驗字

int i;

byte xordata=returnstr[0]

;for

(i=1

;igetlength()

;i++

)sprintf

(conhex,

"%x"

, xordata)

; temp2=conhex;

returnstr=returnstr+temp2;

return returnstr;

}//向串列埠寫入命令

dword c光源控制dlg::

writeserial

(char

*chbuf, dword dwlength)

else

//出錯了

}return dwlength;

}//檢視串列埠返回位元組數

dword c光源控制dlg::

getbufferlength()

//讀取串列埠返回資訊

dword c光源控制dlg::

readserial

(byte *chbuf, dword dwlength)

//16進製制轉byte

byte c光源控制dlg::

conhexstrtobyte

(char str)

else

if(str==

'a'||str==

'a')

else

if(str==

'b'||str==

'b')

else

if(str==

'c'||str==

'c')

else

if(str==

'd'||str==

'd')

else

if(str==

'e'||str==

'e')

else

if(str==

'f'||str==

'f')

return0;

}

4、控制指令

//開關光源

if(light1_openorclose)

//開》關

else

}else

//關》開

else

}//文字框輸入亮度+回車確認

bool c光源控制dlg::

pretranslatemessage

(msg* pmsg)

return true;}if

(pmsg-

>message == wm_keydown && pmsg-

>wparam == vk_escape)

return true;

return cdialogex::

pretranslatemessage

(pmsg)

;}

Anjularjs控制器通訊

anjularjs控制器通訊有三種方式 1,子控制器繼承父控制器中的內容,即利用作用域繼承的方式 2,利用事件的方式,即 on,emit,boardcast 3,服務方式,寫乙個服務的單列,然後注入來使用 利用作用域的繼承方式 由於作用域的繼承是基於js的原型繼承方式,所有有兩種情況,當作用域上面為...

控制器之間的通訊

由於作用域的繼承是基於js的原型繼承方式,所以這裡分為兩種情況,當作用域上面的值為基本型別的時候,修改父作用域上面的值會 影響到子作用域,反之,修改子作用域只會影響子作用域的值,不會影響父作用域上面的值 如果需要父作用域與子作用域共享乙個值 的話,就需要用到後面一種,即作用域上的值為物件,任何一方的...

jmeter控制器 交替控制器

1.簡單使用 如下圖,設定1個執行緒,執行3次 執行結果如下圖 2.巢狀乙個控制器,不勾選忽略子控制器 測試計畫如下圖 巢狀乙個迴圈控制器,迴圈次數設定3次 執行緒組設定1個執行緒,執行5次 執行結果如下圖 總結 交替執行到迴圈控制器時,迴圈執行結束後,在進行下一次的交替。3.巢狀乙個控制器,勾選忽...