2020.03.24 update
簡介:
RS232/RS422/RS485 這個是屬於串列埠(COM Port)的一種接口,
RS232是一對一的通訊,
RS422/RS485是可以一對多的通訊,
在VS中,SerialPort 是內建元件,拉下來就能用了
它位屬於工具箱中元件標籤頁裡
說明一下這個元件裡的傳輸方法
為ASCII,無法送中文。
為ASCII,無法送中文。
Write(byte[] buffer, int offset, int count)
可傳送中文字。
因此
透過編碼將字串轉成Unicode格式的Byte陣列。
Byte[] buf = Encoding.Unicode.GetByte(String);
透過編碼將字串轉成UTF8格式的Byte陣列。
Byte[] buf = Encoding.UTF8.GetByte(String);
透過編碼將字串轉成系統語言格式的Byte陣列,而我的系統是中文,也就是ANSI Big5的格式。
Byte[] buf = Encoding.Default.GetByte(String);
中文是無法轉成ASCII的,會剩下問號
Byte[] buf = Encoding.ASCII.GetByte(String);
通訊協定、通訊設定如果對,基本上只要
serialPort1.Open();
就能開始傳送了(預設為COM1 9600 8 N 1)
byte[] buf = Encoding.Default.GetBytes(textBox1.Text);
serialPort1.Write(buf,0,buf.Length);
收碼偷懶寫在Timer
if (!serialPort1.IsOpen) return;
try
{
int len = serialPort1.ReadBufferSize;
byte[] buf = new byte[len];
serialPort1.Read(buf, 0, len);
String data = Encoding.Default.GetString(buf, 0, len);
data = data.Trim('\0');
textBox2.AppendText(data + "\r\n");
}
catch (TimeoutException) { }
2018/04/26 Add :
//取得目前電腦現有的COM Port (含使用中的)
//這個方法比較穩定,就算使用的是USB熱插拔的方式,也能確保資料的正確性。缺點是沒有名稱,得到的就是COM1、COM2 ... 這樣的內容
using System.IO.Ports;
string[] names = SerialPort.GetPortNames();
foreach(string s in names) comboBox2.Items.Add(s);
if (names.Length > 0) comboBox2.SelectedIndex = 0;
using Microsoft.Win32;//for RegistryKey
//取得註冊在電腦中COM Port的名稱,但這方法有時會發生錯誤,
//有時候因為USB太平凡的熱插拔,導致註冊檔與實際不同步
//該消失沒消失,該出現沒出現,
以這張圖為例,可以取得名稱(EX: \Device\Serial0)與數值(EX: COM9)
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Hardware\DeviceMap\SerialComm");
if (key != null)
{
//讀取所有串列通訊的名稱
String[] names = key.GetValueNames();
foreach (String s in names)
{
comboBox1.Items.Add(key.GetValue(s) + " " + s);
}
}
我的問卷調查
相關文章:
留言列表