日期:2014-05-18  浏览次数:20720 次

PLC与计算机串口通信问题?
请教高手
怎样实现PLC与计算机的串口通信哦?? 我知道在C#中可以用SerialPort类来实现,可是我不知道怎样去用这个类
请教各路高手指点迷津。能给出具体例子或程序的最好不过了 谢谢啦!!

------解决方案--------------------
假设为文本传送

初始化串口

serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.Parity = Parity.None;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;

if (serialPort1.IsOpen) { serialPort1.Close(); }
serialPort1.Open();

发送

private void button1_Click(object sender, EventArgs e)
{
serialPort1.Write("ABCDEFG\r\n");
}

接收
private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.BytesToRead == 0)
{
return;
}
char[] buffer = new char[serialPort1.BytesToRead];
serialPort1.Read(buffer, 0, serialPort1.BytesToRead);
string b = new string(buffer);
}
------解决方案--------------------
1.添加using Sysytem.IO.Ports或者直接往界面里面放入一个serialport控件
2.public SerialPort serialPort1=new SerialPort ();实例化对象(如果是放控件的方式就不用了)
private string b;//用来显示接收到的数据
3.serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);//定义串口接收事件*/
4.private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (serialPort1.BytesToRead == 0) 

return; 

char[] buffer = new char[serialPort1.BytesToRead]; 
serialPort1.Read(buffer, 0, serialPort1.BytesToRead); 
b = new string(buffer); //借用楼上
this.Invoke(SerialDelegate);//委托机制显示接收到的数据
}
5.打开串口try
{
if (serialPort1.IsOpen == false)
{
serialPort1.Open();
}
else
{
serialPort1.Close();
serialPort1.Open();
}
}
catch (Exception e)
{
//MessageBox.Show("错误:" + e.Message);
//if (e.Message == "对端口”COM1“的访问被拒绝。")
MessageBox .Show ("当前设置的串口不存在或者已经被占用,请重新设置串口并尝试连接");

if (serialPort1.IsOpen == true)
{
serialPort1.DiscardOutBuffer();
}

6.由于线程安全问题,如果要将接收到的数据显示出来需要使用委托的机制,故:
private delegate void MydelegateShow();//声明一个委托
private MydelegateShow SerialDelegate;//实例化一个委托对象
同时在窗口构造函数中添加SerialDelegate = new MydelegateShow(UpdateBox);
7.编写UpdateBox代码:
private void UpdateBox()
{
textBox1.Text+=b;
}
8.发送是主动的,可以按照需求发送就可以