close

2020.03.24 update

 

簡介:

RS232/RS422/RS485 這個是屬於串列埠(COM Port)的一種接口,

RS232是一對一的通訊,

RS422/RS485是可以一對多的通訊,

在VS中,SerialPort 是內建元件,拉下來就能用了

它位屬於工具箱元件標籤頁裡

image

 

說明一下這個元件裡的傳輸方法

WriteLine(String)

ASCII,無法送中文。

 

Write(String)

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);
            }

}

我的問卷調查

相關文章:

arrow
arrow

    史克威爾凱特 發表在 痞客邦 留言(0) 人氣()