色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

讀取RS485串口寄存器狀態(tài)

張吉惟2年前15瀏覽0評論

讀取RS485串口寄存器狀態(tài)?

這其實就是一個用C#寫一個串口調(diào)試的工具,下面看怎么實現(xiàn)

1、在工具里面找到串口控件,拖到窗口上即可。然后添加需要的各種按鍵和顯示框控件等2.綁定事件 其實也沒啥,系統(tǒng)都會幫我們?nèi)拷ê茫挥梦覀冊偃ヒ恍幸恍械娜ヌ砑哟a,so easy!!

this.Serial_Rate.SelectedIndexChanged += new System.EventHandler(this.Serial_Param_Changed);// 下拉列表綁定事件

this.Serial_OpenPort.Click += new System.EventHandler(this.Button_OpenPort_Click);//打開串口綁定事件

this.Serial_Send_Data.Click += new System.EventHandler(this.Serial_Send_Data_Click);//發(fā)送數(shù)據(jù)綁定事件

this.Serial_SendText.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Serial_SendText_PressKey);//發(fā)送消息框綁定事件 過濾按鍵

this.Serial_RecvText.TextChanged += new System.EventHandler(this.Serial_RecvText_TextChanged);//接收數(shù)據(jù)框綁定事件 自動下拉到最下面

this.Serial_Display_Hex.Click += new System.EventHandler(this.Serial_Display_Hex_CheckedChanged);//已hex 顯示 選擇框綁定事件

this.Serial_Empty.Click += new System.EventHandler(this.Serial_Empty_Click);//清空按鈕綁定事件

3.串口的打開與關(guān)閉 這個也挺簡單的,主要是判斷當(dāng)前串口是否打開,如果沒有的話,就打開,

private void Button_OpenPort_Click(object sender, EventArgs e)

{

if (Serial1.IsOpen)

{

Serial1.Close();//關(guān)閉串口

}

else

{

Serial_Open();//讀取串口設(shè)置,并打開串口

}

Serial_Status();//根據(jù)串口狀態(tài),修改狀態(tài)指示燈和按鈕內(nèi)容

}

4.數(shù)據(jù)的發(fā)送(需要注意的地方就是 在發(fā)送之間,先將發(fā)送的內(nèi)容轉(zhuǎn)換編碼形式,發(fā)送的時候用字節(jié)形式發(fā)送)

private void Serial_Send_Data_Click(object sender, EventArgs e)

{

if (Serial_SendText.Text.Length > 0)

{

if (Serial1.IsOpen == false)

{

Serial_Open();

Serial_Status();

}

if (Serial_SendWithHex.Checked == false)

{

string TxBuff = Serial_SendText.Text;

byte[] Tx = Encoding.GetEncoding("gb2312").GetBytes(TxBuff);

Comm_Send_Bytes += Tx.Length;

Serial_SendNum.Text = "發(fā)送:" + Comm_Send_Bytes.ToString();

Serial1.Write(Tx, 0, Tx.Length);

}

else

{

string TxTemp = Serial_SendText.Text;

byte[] Serial_SendBuff = Str2Hex(TxTemp);

Comm_Send_Bytes += Serial_SendBuff.Length;

Serial_SendNum.Text = "發(fā)送:" + Comm_Send_Bytes.ToString();

Serial1.Write(Serial_SendBuff, 0, Serial_SendBuff.Length);

}

}

else

{

MessageBox.Show("發(fā)送框不能為空!");

}

}

5.數(shù)據(jù)接收(C# 的SerialPort 控件,只能在子進(jìn)程里面運(yùn)行,所以需要使用委托事件來刷新接收框中的內(nèi)容,這里我是以字節(jié)形式接收,方便計算正確的長度

private void Com_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{

if (Serial1.IsOpen)

{

try

{

//開辟接收緩沖區(qū)

byte[] ReDatas = new byte[Serial1.BytesToRead];

//從串口讀取數(shù)據(jù)

Comm_Received_Bytes += Serial1.Read(ReDatas, 0, Serial1.BytesToRead);

//實現(xiàn)數(shù)據(jù)的解碼與顯示

this.Invoke(updateText, ReDatas);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

}

6.清空接收發(fā)送區(qū)(數(shù)據(jù)太多了,看的累,有什么難的,點一點不就清空了—哈(-_-))

//清空輸入輸出TextBox 發(fā)送接收數(shù)據(jù)長度及l(fā)abel

private void Serial_Empty_Click(object sender, EventArgs e)

{

Comm_Received_Bytes = 0;

Comm_Send_Bytes = 0;

Serial_SendNum.Text = "發(fā)送:0";

Serial_RecvNum.Text = "接收:0";

Serial_RecvText.Text = "";

Serial_SendText.Text = "";

Serial_Rx_Buff_Hex = "";

Serial_Rx_Buff_Ascii = "";

}

7.注意事項 a.關(guān)于串口發(fā)送中文亂碼的解決方法(主要就是編碼的問題) 1). 使用System.Text.Encoding 類 的編碼轉(zhuǎn)換方法(練習(xí)時 可以試試)

//接收區(qū)

string ReDatas = Serial1.ReadExisting();

Comm_Received_Bytes += ReDatas.Length;

byte[] RecvBuff = System.Text.Encoding.GetEncoding("gb2312").GetBytes(ReDatas);

ReDatas = System.Text.Encoding.GetEncoding("gb2312").GetString(RecvBuff );

//實現(xiàn)數(shù)據(jù)的解碼與顯示

this.Invoke(updateText, ReDatas);

//發(fā)送區(qū)

string TxBuff = Serial_SendText.Text;

byte[] Tx = GB2312.GetBytes(TxBuff);

Comm_Send_Bytes += Tx.Length;

Serial_SendNum.Text = "發(fā)送:" + Comm_Send_Bytes.ToString();

Serial1.Write(Tx, 0, Tx.Length);

上面列出了主要的代碼,其實就是一個串口助手。