Form1.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using System.Windows.Forms;
  9. namespace sickTest
  10. {
  11. public partial class Form1 : Form
  12. {
  13. private TcpClient tcpClient;
  14. NetworkStream stream;
  15. private int bufferSize = 0x8000;
  16. private string startCmd = "02 73 45 4E 20 4C 4D 44 73 63 61 6E 64 61 74 61 20 31 03";
  17. private string endCmd = "02 73 45 4E 20 4C 4D 44 73 63 61 6E 64 61 74 61 20 30 03";
  18. int flag = 0;
  19. public Form1()
  20. {
  21. InitializeComponent();
  22. tcpClient = new TcpClient();
  23. tcpClient.Connect(IPAddress.Parse("192.168.1.31"), 2111);
  24. Console.WriteLine("连接成功");
  25. stream = tcpClient.GetStream();
  26. }
  27. //开始
  28. private void button1_Click(object sender, EventArgs e)
  29. {
  30. //byte[] byteStartCmd = HexStringToBinary(startCmd);
  31. //string result = HexStringToASCII(byteStartCmd);
  32. //byte[] b = Encoding.UTF8.GetBytes(result);
  33. //stream.Write(b, 0, b.Length);
  34. //byte[] data = new byte[bufferSize];
  35. //stream.Read(data, 0, bufferSize);
  36. //stream.Close();
  37. //string str = HexStringToASCII(data);
  38. // 初始化一个缓存区
  39. flag = sendCmd(startCmd);
  40. byte[] buffer = new byte[bufferSize];
  41. int read = 0;
  42. int block;
  43. Task.Factory.StartNew(() =>
  44. {
  45. while ((block = stream.Read(buffer, read, buffer.Length - read)) > 0 && flag != 2)
  46. {
  47. // 重新设定读取位置
  48. read += block;
  49. // 检查是否到达了缓存的边界,检查是否还有可以读取的信息
  50. if (read == buffer.Length)
  51. {
  52. // 尝试读取一个字节
  53. int nextByte = stream.ReadByte();
  54. // 读取失败则说明读取完成可以返回结果
  55. if (nextByte == -1)
  56. {
  57. Console.WriteLine("读取失败");
  58. //return buffer;
  59. }
  60. // 调整数组大小准备继续读取
  61. byte[] newBuf = new byte[buffer.Length * 2];
  62. Array.Copy(buffer, newBuf, buffer.Length);
  63. newBuf[read] = (byte)nextByte;
  64. // buffer是一个引用(指针),这里意在重新设定buffer指针指向一个更大的内存
  65. buffer = newBuf;
  66. read++;
  67. }
  68. Thread.Sleep(1);
  69. }
  70. });
  71. Task.Factory.StartNew(() =>
  72. {
  73. string str;
  74. while (buffer != null && flag != 2)
  75. {
  76. str = System.Text.Encoding.Default.GetString(buffer);
  77. Log.WriteLog(LogType.PROCESS, str);
  78. //this.Invoke(new Action(() =>
  79. //{
  80. // str = System.Text.Encoding.Default.GetString(buffer);
  81. // this.richTextBox1.Text = str;
  82. // Thread.Sleep(1000);
  83. // this.richTextBox1.Clear();
  84. // string[] data = str.Split(' ');
  85. // if (data.Length >= 25)
  86. // {
  87. // Console.WriteLine(data[25]);
  88. // }
  89. //}));
  90. Thread.Sleep(1000);
  91. }
  92. });
  93. }
  94. //结束
  95. private void button2_Click(object sender, EventArgs e)
  96. {
  97. flag = sendCmd(endCmd);
  98. }
  99. private int sendCmd(string cmd)
  100. {
  101. if (cmd.Equals(startCmd))
  102. {
  103. byte[] byteStartCmd = HexStringToBinary(startCmd);
  104. string result = HexStringToASCII(byteStartCmd);
  105. byte[] b = Encoding.UTF8.GetBytes(result);
  106. stream.Write(b, 0, b.Length);
  107. return 1;
  108. }
  109. if (cmd.Equals(endCmd))
  110. {
  111. byte[] byteStartCmd = HexStringToBinary(endCmd);
  112. string result = HexStringToASCII(byteStartCmd);
  113. byte[] b = Encoding.UTF8.GetBytes(result);
  114. stream.Write(b, 0, b.Length);
  115. return 2;
  116. }
  117. return 0;
  118. }
  119. /// <summary>
  120. /// 将一条十六进制字符串转换为ASCII
  121. /// </summary>
  122. /// <param name="hexstring">一条十六进制字符串</param>
  123. /// <returns>返回一条ASCII码</returns>
  124. private static string HexStringToASCII(byte[] bt)
  125. {
  126. //byte[] bt = HexStringToBinary(hexstring);
  127. string lin = "";
  128. for (int i = 0; i < bt.Length; i++)
  129. {
  130. lin = lin + bt[i] + " ";
  131. }
  132. string[] ss = lin.Trim().Split(new char[] { ' ' });
  133. char[] c = new char[ss.Length];
  134. int a;
  135. for (int i = 0; i < c.Length; i++)
  136. {
  137. a = Convert.ToInt32(ss[i]);
  138. c[i] = Convert.ToChar(a);
  139. }
  140. string b = new string(c);
  141. return b;
  142. }
  143. /// <summary>
  144. /// 16进制字符串转换为二进制数组
  145. /// </summary>
  146. /// <param name="hexstring">用空格切割字符串</param>
  147. /// <returns>返回一个二进制字符串</returns>
  148. private static byte[] HexStringToBinary(string hexstring)
  149. {
  150. string[] tmpary = hexstring.Trim().Split(' ');
  151. byte[] buff = new byte[tmpary.Length];
  152. for (int i = 0; i < buff.Length; i++)
  153. {
  154. buff[i] = Convert.ToByte(tmpary[i], 16);
  155. }
  156. return buff;
  157. }
  158. }
  159. }