Intro Csharp RS232

Intro Csharp RS232

這篇介紹透過RS232 Protocol對device做write和read操作。

初始RS232連線:

SerialPort serialPort = new SerialPort();
public bool Init(int _comPort, BaudRateType baudRateType, ScanType scanType)
{
comPort = _comPort;
try
{
var comportName = string.Format(@”COM{0}”, comPort);
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
}
serialPort = new SerialPort
{
PortName = comportName
};
switch (baudRateType)
{
case BaudRateType.BaudRate9600:
serialPort.BaudRate = 9600;
break;
case BaudRateType.BaudRate19200:
serialPort.BaudRate = 19200;
break;
case BaudRateType.BaudRate38400:
serialPort.BaudRate = 38400;
break;
case BaudRateType.BaudRate57600:
serialPort.BaudRate = 57600;
break;
case BaudRateType.BaudRate115200:
serialPort.BaudRate = 115200;
break;
default:
serialPort.BaudRate = 19200;
break;
}
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.ReadBufferSize = 1024;
serialPort.WriteBufferSize = 1024;

    if (serialPort != null && !serialPort.IsOpen)
    {
        try
        {
            serialPort.Open();
        }
        catch (Exception ex)
        {
            if (!MachineDataObj.IsTestAutoMode)
            {
                LogUtil.logger.Error(Convert.ToString(ex));
            }
            serialPort = null;
            return false;
        }
    }

    this.scanType = scanType;
    openCom = 1;
}
catch (Exception ex)
{
    TelegramBotType.FatalAndCallTelegram(Convert.ToString(ex));
}
return true;

}

Form_Load 初始設定:

serialPort.DataReceived += new SerialDataReceivedEventHandler(dataReceived);
//default是false,需測試過才能使用
serialPort.DtrEnable = true;
//default是false,需測試過才能使用
serialPort.RtsEnable = true;
serialPort.ReadTimeout = 1000;

Read Data via RS232 Protocol:

private void dataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort.IsOpen)
{
DateTime dateTimeNow = DateTime.Now;
//dateTimeNow.GetDateTimeFormats();
textBoxReceive.Text += string.Format(“{0}\r\n”, dateTimeNow);
//dateTimeNow.GetDateTimeFormats(‘f’)[0].ToString() + “\r\n”;
textBoxReceive.ForeColor = Color.Red;

    //ASCII
    if (radioButtonReceiveDataASCII.Checked == true) 
    {
        try
        {
            String input = serialPort.ReadLine();
            textBoxReceive.Text += input + "\r\n";
            // save data to file
            if (saveDataFS != null)
            {
                byte[] info = new UTF8Encoding(true).GetBytes(input + "\r\n");
                saveDataFS.Write(info, 0, info.Length);
            }
        }
        catch(System.Exception ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
        
        textBoxReceive.SelectionStart = textBoxReceive.Text.Length;
        textBoxReceive.ScrollToCaret();
        serialPort.DiscardInBuffer(); 
    }
    else //HEX
    {
        try
        {

            string input = serialPort.ReadLine();
            char[] values = input.ToCharArray();
            foreach (char letter in values)
            {
                // Get the integral value of the character.
                int value = Convert.ToInt32(letter);
                // Convert the decimal value to a hexadecimal value in string form.
                string hexOutput = String.Format("{0:X}", value);
                textBoxReceive.AppendText(hexOutput + " ");
                textBoxReceive.SelectionStart = textBoxReceive.Text.Length;
                textBoxReceive.ScrollToCaret();
                //textBoxReceive.Text += hexOutput + " ";

            }

            // save data to file
            if (saveDataFS != null)
            {
                byte[] info = new UTF8Encoding(true).GetBytes(input + "\r\n");
                saveDataFS.Write(info, 0, info.Length);
            }


        }
        catch(System.Exception ex)
        {
            MessageBox.Show(ex.Message, "Error");
            textBoxReceive.Text = "";
        }
    }
}
else
{
    MessageBox.Show("Com error");
}

}

Write Data via RS232 Protocol:

private void buttonSendData_Click(object sender, EventArgs e)
{
if (!serialPort.IsOpen)
{
MessageBox.Show(“Open comPort”);
return;
}

String strSend = textBoxSend.Text;
if (radioButtonSendDataASCII.Checked == true) //Send ASCII
{
    serialPort.WriteLine(strSend);//发送一行数据 

}
else
{
    //Send 16進制用HEX
     
    char[] values = strSend.ToCharArray();
    foreach (char letter in values)
    {
        // Get the integral value of the character.
        int value = Convert.ToInt32(letter);
        // Convert the decimal value to a hexadecimal value in string form.
        string hexIutput = String.Format("{0:X}", value);
        serialPort.WriteLine(hexIutput);

    }
}

}