- 最近這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);
}