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

C#串口 上位机如何向下位机发送命令和接收下位机上传的数据
上位机:pc机
下位机:单片机
pc机与单片机联机通信正常后,上位机怎么向下位机发送命令,单片机收到命令后开始上传预置的数据
请问:pc机如何下发命令和如何读取上传的数据。
我以前对这个一点的不了解的,查了几天也了解了点串口通信
也还是没点头绪。刚到这个公司,他们的下位机已经写好了的,只需要写上位机,可是我不知道怎么写。
希望给位大侠指点一下,最好有代码,谢谢!急用啊!


协议的基本格式是:
起始位标志(1个字节)+通信协议版本号(1个字节)+设备描述(1个字节)
+设备标识码(1个字节)+控制标识码(1个字节)+info字节长度(2个字节)
+控制数据信息(长度不确定)+校验和码(2个字节)+结束码(1个字节) 各个字节都是以十六进制表示。

------解决方案--------------------
1. .net中有个串口类,你可以利用。
2. 确定发送的串口号。
3. 设置串口参数(波特率、停止位、奇偶校验)
4. 组合发送的协议格式
5. 以字节型数据发送


接收就简单了。把接收来的字节型数据转化为你所需的就可以。

网上这方面的资料一大把。搜一下,看看他们的流程。
------解决方案--------------------
很简单的,你从网上搜串口编程,出来一堆,我给你参考,仅供参考:
用串口类SerialPort

1、打开串口
 public bool ComOpen(int OutTime, string ComNum, int BaudRate)
{
try
{
com.PortName = ComNum;
com.BaudRate = 9600;
com.DataBits = 8;
//com.Parity = Parity.Even;
com.WriteTimeout = OutTime;
com.ReadTimeout = OutTime;
com.Open();
}
catch
{
return false;

//MessageBox.Show("打开串口失败!", "系统提示");
}
return true;
}
2、先把你的协议转换为byte数据,具体的你自己拼写,下面的是把你的字符串转换为为ascII码,你的十六进制的其实是ascII码形式
ASCIIEncoding MyInfo = new ASCIIEncoding();
byte[] MySend = MyInfo.GetBytes(AlarmCode);

在数组中,起始位一般是0x02还是0x03啊,忘了,你自己看着拼一下

3、串口发送或者接受命令,把你的数组发送出去或者取出来,都一样

public byte[] ComSend(byte[] sendbyte,int SleepTime)
{
//byte[] refbyte = new byte[500];
int reallength;
//try
//{
com.Write(sendbyte, 0, sendbyte.Length);
//return sendbyte;
//}
//catch
//{
// //MessageBox.Show("发送数据失败!");
// return null;
//}
try
{
reallength = com.BytesToRead;
byte[] refbyte = new byte[reallength];
reallength = com.Read(refbyte, 0, com.BytesToRead);
return refbyte;
}
catch
{
return null;
// MessageBox.Show("接收数据失败!");
}

}
------解决方案--------------------
探讨

没人来么,我现在分数太少了,只能20分啊,在论坛发的第一帖,小女子求各位大侠赐教了,感激不尽,第一次接触串口通信,查各种资料就是没查到可用的,可能是自己的问题。求代码,越详细越好啊!