Form1.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO.Ports;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace Honeywell1900扫码枪程序触发
  13. {
  14. public partial class Form1 : Form
  15. {
  16. SerialPort serialPort1 = new SerialPort();
  17. delegate void myDelegate(); //委托,此为重点.
  18. public Form1()
  19. {
  20. InitializeComponent();
  21. }
  22. private void button3_Click(object sender, EventArgs e)
  23. {
  24. serialPort1 = new SerialPort();
  25. serialPort1.PortName = comboBox1.Text;
  26. try
  27. {
  28. serialPort1.Open();
  29. serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
  30. }
  31. catch (Exception ex)
  32. {
  33. label3.ForeColor = Color.Red;
  34. label3.Text = "打开串口出错";
  35. //MessageBox.Show("打开串口出错");
  36. }
  37. label3.ForeColor = Color.Green;
  38. label3.Text = "串口已打开";
  39. }
  40. private void button4_Click(object sender, EventArgs e)
  41. {
  42. if (serialPort1.IsOpen)
  43. {
  44. serialPort1.Close();
  45. label3.ForeColor = Color.Green;
  46. label3.Text = "关闭串口成功";
  47. return;
  48. }
  49. label3.ForeColor = Color.Black;
  50. label3.Text = "关闭串口成功";
  51. }
  52. private void button1_Click(object sender, EventArgs e)
  53. {
  54. Byte[] BSendTemp = HexStringToBytes("16 54 0D");
  55. serialPort1.Write(BSendTemp,0,BSendTemp.Length);//发送数据
  56. }
  57. private void button2_Click(object sender, EventArgs e)
  58. {
  59. Byte[] BSendTemp = HexStringToBytes("16 55 0D");
  60. this.serialPort1.Write(BSendTemp, 0, BSendTemp.Length);//发送数据
  61. }
  62. private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  63. {
  64. textBox1.BeginInvoke(new myDelegate(updateTextBox));
  65. }
  66. public void updateTextBox()
  67. {
  68. int len = serialPort1.BytesToRead;
  69. byte[] sbytes = new byte[len];
  70. serialPort1.Read(sbytes, 0, len);
  71. textBox1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.000")+"扫到码如下:\r\n"+Encoding.UTF8.GetString(sbytes);
  72. }
  73. public static byte[] HexStringToBytes(string hs)
  74. {
  75. string[] strArr = hs.Trim().Split(' ');
  76. byte[] b = new byte[strArr.Length];
  77. //逐个字符变为16进制字节数据
  78. for (int i = 0; i < strArr.Length; i++)
  79. {
  80. b[i] = Convert.ToByte(strArr[i], 16);
  81. }
  82. //按照指定编码将字节数组变为字符串
  83. return b;
  84. }
  85. private string receive_data = "";
  86. private void button6_Click(object sender, EventArgs e)
  87. {
  88. receive_data = "34";
  89. }
  90. private void button5_Click(object sender, EventArgs e)
  91. {
  92. Task.Factory.StartNew(()=> {
  93. bool ret = TimeoutGetValue(ref receive_data, 4000);
  94. if (ret)
  95. {
  96. System.Diagnostics.Trace.WriteLine(ret+ receive_data);
  97. receive_data = "";
  98. }
  99. else
  100. {
  101. System.Diagnostics.Trace.WriteLine("获取超时");
  102. }
  103. });
  104. }
  105. /// <summary>
  106. /// 用来获取data变量的值,并设置超时时间
  107. /// </summary>
  108. /// <param name="data">ref 传递变量</param>
  109. /// <param name="timeout">超时时间</param>
  110. /// <returns></returns>
  111. private bool TimeoutGetValue(ref string data,int timeout)
  112. {
  113. int i_count = 0;
  114. int all_count = timeout / 200;
  115. while (data.Equals("") && i_count <all_count)
  116. {
  117. i_count++;
  118. Thread.Sleep(200);
  119. }
  120. if (data.Equals(""))
  121. {
  122. return false;
  123. }
  124. else
  125. {
  126. return true;
  127. }
  128. }
  129. }
  130. }