- 最近这2天在做winform程序,用到json,supersocket.client SerialPort
json使用的是Newtonsoft.Json.dll ,SuperSocket.ClientEngine使用的是SuperSocket.ClientEngine.dll和SuperSocket.ProtoBase.dll SerialPort 是winform自带的
- Json
string josnString = File.ReadAllText("./json/news.json", Encoding.Default);
listRtuBean = JsonConvert.DeserializeObject<List<RtuBean>>(josnString);
listRtuBean = listRtuBean.OrderBy(m => m.id).ToList(); //用于排序
- SuperSocket.ClientEngine
https://github.com/kerryjiang/SuperSocket.ClientEngine
需要引入
https://github.com/kerryjiang/SuperSocket.ProtoBase
SuperSocket.ClientEngine最新的是2017版的,我的是2015下的是老的
而且打开的是.csproj,按照visual studio 2015要求保存为了SuperSocket.ClientEngine.Net45.sln
然后引入的SuperSocket.ProtoBase,引入的时候是到src下SuperSocket.ProtoBase.Net45.csproj这个
具体使用,我的是需要传递byte[]的按理说我按照这个要求能够增加一个新类在SuperSocket.ProtoBase中指定传递byte,弄了2天没成,虽然有SuperSocket.base(server端)的代码,后来使用了他中的AsyncTcpSession client = null;
具体用法
private void initSocket()
{
//AsyncTcpSession client = new AsyncTcpSession(new IPEndPoint(IPAddress.Parse(UartInfo.ipAddress), UartInfo.port));
client = new AsyncTcpSession();
// 连接断开事件
client.Closed += client_Closed;
// 收到服务器数据事件
client.DataReceived += client_DataReceived;
// 连接到服务器事件
client.Connected += client_Connected;
// 发生错误的处理
client.Error += client_Error;
client.Connect(new IPEndPoint(IPAddress.Parse(UartInfo.ipAddress), UartInfo.port));
}
private void client_Connected(object sender, EventArgs e)
{
Console.WriteLine("连接成功");
}
private void client_DataReceived(object sender, DataEventArgs e)
{
byte[] buffer = new byte[e.Length];
Array.Copy(e.Data, buffer, buffer.Length);
DelgateShowModbusTcpResponse delgateShowModbusTcpResponseByte = new DelgateShowModbusTcpResponse(parseNetData);
Invoke(delgateShowModbusTcpResponseByte, buffer);
}
private void client_Closed(object sender, EventArgs e)
{
client.Close();
Console.WriteLine("连接断开");
//MessageBox.Show("网络连接断开");
}
private void client_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
private void parseNetData(byte[] data)
{
}
但是这个有个问题,就是初始化的时候,如果网络不通,也不报错误,而是在发送的时候报错误
if (client != null && client.IsConnected) {
client.Close();
}
- SerialPort
private void loadCOMControl()
{
try
{
serialPort.PortName = UartInfo.PortName;
serialPort.BaudRate = UartInfo.BaudRate;
if (UartInfo.Parity.Equals("None")) {
serialPort.Parity = Parity.None;
}
else if (UartInfo.Parity.Equals("Odd"))
{
serialPort.Parity = Parity.Odd;
}
else if (UartInfo.Parity.Equals("Even"))
{
serialPort.Parity = Parity.Even;
}
serialPort.DataBits = UartInfo.DataBits;
if (UartInfo.StopBits.Equals("1")) {
serialPort.StopBits = StopBits.One;
}
else if (UartInfo.StopBits.Equals("2"))
{
serialPort.StopBits = StopBits.Two;
}
else if (UartInfo.StopBits.Equals("1.5"))
{
serialPort.StopBits = StopBits.OnePointFive;
}
serialPort.ReadBufferSize = 1024;
serialPort.WriteTimeout = 3000;
serialPort.ReadTimeout = 3000;
serialPort.DataReceived += serialDataReceivedEvent;
bool flag = serialPort.IsOpen;
serialPort.Open();
}
catch (Exception e) {
MessageBox.Show("打开端口失败,请确认改端口是否已经被使用 "+e.Message);
}
}
void serialDataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] bytebuffer = new byte[port.BytesToRead];//serialport读取串口数据
port.Read(bytebuffer, 0, bytebuffer.Length);//串口读取到数据
try
{
lock (this)
{
if (bytebuffer.Length > 0)
{
addByteToByteList(bytebuffer);
writeConsole(bytebuffer);
if (operateFlag == 1 || operateFlag == 4)
{
//读数据返回
if (checkReadRecvData())
{
byte[] feData = ModbusRtu.getModbusReadResponse(portBufferByteList.ToArray());
delByteToByteList(feData);
showReadResponse(feData);
}
}
else if (operateFlag == 2 || operateFlag == 3 || operateFlag == 5 || operateFlag == 6)
{
//写数据返回
if (checkWriteRecvData())
{
byte[] feData = ModbusRtu.getModbusWriteResponse(portBufferByteList.ToArray());
delByteToByteList(feData);
showWriteResponse(feData);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("接收串口数据失败" + ex.Message);
}
}
private void showReadResponse(byte[] feData)
{
DelgateShowReadResponse delgateShowReadResponseByte = new DelgateShowReadResponse(showReadResponseByte);
Invoke(delgateShowReadResponseByte, feData);
}