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