一.背景
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.巢狀乙個控制器,勾選忽...