利用多串口设备进行Socket网络编程
1、安装多串口服务器ETH005软件。软件下载地址:http://download.csdn.net/detail/taomanman/6762173
2、打开ETH005软件,点击“扫描”,如下图:

3、会搜索到设备的IP地址,修改串口COM1的串口波特率为9600,通讯方式修改为485通信,远程IP修改成192.168.0.2,然后点击“连接”,如下图:

4、连接完成后,点击“配置”,如下图:

5、点击“读取配置信息”,如下图:

6、打开串口调试助手,配置远程主机和远程端口号信息,然后连接网络,然后输入十六进制数,然后发送,接收区会将结果输出,如下图:

开始编程:使用Socket进行网络编程,发送指令,获取数据
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、 建立Socket连接
Socket newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ie = new IPEndPoint(IPAddress.Parse("192.168.0.18"), 50001);
try
{
newclient.Connect(ie);
}
catch (SocketException e)
{
MessageBox.Show("连接服务器失败:" + e.Message);
return;
}
ThreadStart myThreaddelegate = new ThreadStart(ReceiveMsg);
myThread = new Thread(myThreaddelegate);
myThread.Start();
2、 发送指令
///<summary>
///发送温湿度数据
///</summary>
public void SendWSD()
{
string wsd = "01 03 00 00 00 03 05 cb";
int m_length = wsd.Length;
byte[] data = new byte[m_length];
//十六进制字符串转换成字符数组(01 03 00 00 00 03 05 cb)
data = ConvertHelper.strToToHexByte(wsd);
int i = newclient.Send(data, data.Length, 0);
//showMsg("温湿度发送消息为:" + wsd + "\r\n");
}
public static class ConvertHelper
{
///<summary>
/// 16进制字符串转字节数组
///</summary>
///<param name="hexString"></param>
///<returns></returns>
public 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).Trim(), 16);
return returnBytes;
}
///<summary>
///字节数组转16进制字符串
///</summary>
///<param name="bytes"></param>
///<returns></returns>
public static string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
///<summary>
///十六进制转十进制
///</summary>
///<param name="hex"></param>
///<returns></returns>
public static string Hex2Ten(string hex)
{
int ten = 0;
for (int i = 0, j = hex.Length - 1; i < hex.Length; i++)
{
ten += HexChar2Value(hex.Substring(i, 1)) * ((int)Math.Pow(16, j));
j--;
}
return ten.ToString();
}
}
3、 接收数据
///<summary>
///接收消息
///</summary>
public void ReceiveMsg()
{
while (true)
{
byte[] data = new byte[1024];
int recv = newclient.Receive(data);
string stringdata = Encoding.UTF8.GetString(data, 0, recv);
//将所读取的字符串转换为字节数组
byte[] content = Encoding.ASCII.GetBytes(stringdata);
if (recv <= 0)
break;
string hexString = ConvertHelper.byteToHexStr(content);
string sd = hexString.Substring(6, 4);
string wd = hexString.Substring(10, 4);
//showMsg("温湿度接收到的返回值串为:" + hexString + "\r\n");
//处理后的温湿度数值
double csd = double.Parse(ConvertHelper.Hex2Ten(sd)) / 100;
double cwd = (double.Parse(ConvertHelper.Hex2Ten(wd)) - 27315) / 100;
showMsg("湿度值为:" + csd + "% 采集时间:[" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "]\r\n");
showMsg("温度值为:" + cwd + "℃ 采集时间:[" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "]\r\n");
}
}
///<summary>
///显示消息
///</summary>
///<param name="msg"></param>
public void showMsg(string msg)
{
{
//在线程里以安全方式调用控件
if (receiveMsg.InvokeRequired)
{
MyInvoke _myinvoke = new MyInvoke(showMsg);
receiveMsg.Invoke(_myinvoke, new object[] { msg });
}
else
{
receiveMsg.AppendText(msg);
}
}
}