初次接触上位机开发,接收PLC传来的视觉检测结果,然后和数据库交互,给下位机的PLC发送指令,主要采用的是R32的串口通信,下面是详细步骤。
一、首先要将串口连接,进行通信。
#region 串口识别
SerialPort ComDevice1 = new SerialPort();
SerialPort ComDevice2 = new SerialPort();
#region StartCom1
private void StartCom1(string com)
{
ComDevice1.DataReceived += new SerialDataReceivedEventHandler(ComDevice1_DataReceived);
ComDevice1.PortName = com;
int BaudRate = 9600;
ComDevice1.BaudRate = BaudRate;// 波特率
ComDevice1.Parity = System.IO.Ports.Parity.None; //0;// 奇偶校验
ComDevice1.DataBits = 8;// 数据位
ComDevice1.StopBits = System.IO.Ports.StopBits.One; //(StopBits)1;// 停止位
ComDevice1.Encoding = System.Text.Encoding.Default;
try
{
if (ComDevice1.IsOpen)
ComDevice1.Close();
ComDevice1.Open();
lbMessage1.Text = com + "串口连接成功";
lbMessage1.ForeColor = Color.Green;
}
catch (Exception ex)
{
lbMessage1.Text += ex.Message;
lbMessage1.ForeColor = Color.Red;
WinFormHelper.PlaySoundError();
return;
}
}
private void CloseCom1(string com)
{
try
{
if (!ComDevice1.IsOpen)
ComDevice1.Open();
if (ComDevice1.IsOpen)
ComDevice1.Close();
lbMessage1.Text = com + "串口断开成功";
lbMessage1.ForeColor = Color.Red;
}
catch (Exception ex)
{
lbMessage1.Text += ex.Message;
lbMessage1.ForeColor = Color.Red;
WinFormHelper.PlaySoundError();
return;
}
}
/****************硬件设备自动扫描操作********************/
private void ComDevice1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
System.Threading.Thread.Sleep(500);
byte[] ReDatas = new byte[ComDevice1.BytesToRead];//返回命令包
ComDevice1.Read(ReDatas, 0, ReDatas.Length);//读取数据
ComDevice1.DiscardInBuffer();//清除接收缓冲区
ComDevice1.DiscardOutBuffer();
txtScanData.Text = System.Text.Encoding.Default.GetString(ReDatas);//获取扫描数据
//检查条码格式
CheckCode(txtScanData.Text.Trim());
MesBarcode = txtScanData.Text;
txtScanData.Focus();
}
catch
{
ComDevice1.DiscardInBuffer();//清除接收缓冲区
ComDevice1.DiscardOutBuffer();
}
}
#endregion
#region StartCom2
private void StartCom2(string com)
{
ComDevice2.DataReceived += new SerialDataReceivedEventHandler(ComDevice2_DataReceived);
ComDevice2.PortName = com;
int BaudRate = 9600;
ComDevice2.BaudRate = BaudRate;// 波特率
ComDevice2.Parity = System.IO.Ports.Parity.None; //0;// 奇偶校验
ComDevice2.DataBits = 8;// 数据位
ComDevice2.StopBits = System.IO.Ports.StopBits.One; //(StopBits)1;// 停止位
ComDevice2.Encoding = System.Text.Encoding.Default;
try
{
if (ComDevice2.IsOpen)
ComDevice2.Close();
ComDevice2.Open();
lbMessage2.Text = com + "串口连接成功";
lbMessage2.ForeColor = Color.Green;
}
catch (Exception ex)
{
lbMessage2.Text += ex.Message;
lbMessage2.ForeColor = Color.Red;
WinFormHelper.PlaySoundError();
return;
}
}
private void CloseCom2(string com)
{
try
{
if (!ComDevice2.IsOpen)
ComDevice2.Open();
if (ComDevice2.IsOpen)
ComDevice2.Close();
lbMessage2.Text = com + "串口断开成功";
lbMessage2.ForeColor = Color.Red;
}
catch (Exception ex)
{
lbMessage2.Text += ex.Message;
lbMessage2.ForeColor = Color.Red;
WinFormHelper.PlaySoundError();
return;
}
}
/****************硬件设备自动扫描操作********************/
private void ComDevice2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
System.Threading.Thread.Sleep(500);
int len = ComDevice2.BytesToRead;
string receivedata = string.Empty;
int buffersize = 8; //十六进制数的大小(假设为6byte)
byte[] buffer = new byte[buffersize]; //创建缓冲区
if (len != 0)
{
ComDevice2.Read(buffer, 0, buffersize);
receivedata = Encoding.Default.GetString(buffer);
}
if (receivedata.Trim() != "")
{
string str = byteToHexStr(buffer);
ComDevice2.DiscardInBuffer();//清除接收缓冲区
ComDevice2.DiscardOutBuffer();
//获取PLC数据
txtPLC.Text = str.Substring(0, 2);
ReciveData(txtPLC.Text);
}
else
{
string error = receivedata + ":未接收到数据。";
lbScanMessage.Text = error;
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion
/// <summary>
/// 检查扫描格式是否正确
/// </summary>
/// <param name="text"></param>
private void CheckCode(string text)
{
if (string.IsNullOrEmpty(text))
{
string error = text + ":未获取到数据。";
lbScanMessage.Text = error;
return;
}
if (text.Length != 13)
{
string error = text + ":扫描数据异常,位数不等于13。";
lbScanMessage.Text = error;
return;
}
if (!text.StartsWith("ZZC"))
{
string error = text + ":扫描数据异常,未扫描MES条码。";
lbScanMessage.Text = error;
return;
}
if (text.Substring(0, 6).ToUpper() == "NOREAD")
{
string error = text + ":扫描数据异常。";
lbScanMessage.Text = error;
return;
}
}
#endregion
二、接收和发送需要的PLC值,PLC的值在通过串口通信接收时需要转换字节。
private void SendDataToCom(byte[] color)
{
try
{
if (this.ComDevice2.IsOpen)
this.ComDevice2.Write(color, 0, color.Length);
}
catch (Exception e)
{
}
finally
{
}
}
/// <summary>
/// string 转byte
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] strToToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
/// <summary>
/// byte[] 转string
/// </summary>
/// <param name="bytes"></param>