锐腾搅拌上料功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

369 lines
12 KiB

5 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using DevExpress.XtraEditors;
  9. using System.Data.SqlClient;
  10. using ICSSoft.Frame.APP;
  11. using System.Configuration;
  12. using ICSSoft.Frame.APP.Helper;
  13. using ICSSoft.Frame.APP.Model;
  14. using DevExpress.XtraGrid.Columns;
  15. using System.Linq;
  16. using System.IO.Ports;
  17. namespace ICSSoft.Frame.APP
  18. {
  19. public partial class FormCom : DevExpress.XtraEditors.XtraForm, ComResult
  20. {
  21. List<SelectItemExt> ItemList = new List<SelectItemExt>();
  22. string[] PostNames;
  23. SerialPort port;
  24. public string result { get; set; }//返回值
  25. List<Color> color = new List<Color>()
  26. {
  27. Color.BlueViolet,
  28. Color.Orange,
  29. Color.Black,
  30. Color.Blue,
  31. Color.YellowGreen
  32. };
  33. public FormCom()
  34. {
  35. InitializeComponent();
  36. this.txtXonXoff.SelectedIndex = 0;
  37. this.txtAddress.SelectedIndex = 0;
  38. this.txtStop.SelectedIndex = 0;
  39. this.txtDataBits.SelectedIndex = 0;
  40. this.txtParitv.SelectedIndex = 0;
  41. }
  42. private void btnOK_Click(object sender, EventArgs e)
  43. {
  44. this.DialogResult = DialogResult.OK;
  45. this.result = txtResult.Text;
  46. this.Close();
  47. this.port.Dispose();
  48. }
  49. private void FormEcAdd_Load(object sender, EventArgs e)
  50. {
  51. SetRichTextboxContent(RTBox_Log1, "开始获取可用串口信息 ", true);
  52. PostNames = SerialPort.GetPortNames();
  53. if (PostNames.Count() <= 0)
  54. SetRichTextboxContent(RTBox_Log1, "暂无可用串口!", false);
  55. else
  56. {
  57. SetRichTextboxContent(RTBox_Log1, "获取可用串口信息成功", true);
  58. if (this.txtCom.Properties.Items.Count > 0)
  59. this.txtCom.Properties.Items.Clear();
  60. this.txtCom.Properties.Items.AddRange(PostNames);
  61. this.txtCom.SelectedIndex = 0;
  62. }
  63. btnOpenOrClose.TextChanged += (object senders, EventArgs es) =>
  64. {
  65. btnOpenOrClose.BackColor = Color.Green;
  66. };
  67. }
  68. private void btnBigenOrSuspend_Click(object sender, EventArgs e)
  69. {
  70. try
  71. {
  72. CheckPort();
  73. if (port != null && port.IsOpen)//关闭串口
  74. {
  75. port.Close();
  76. port = null;
  77. SetRichTextboxContent(RTBox_Log1,"关闭成功", true);
  78. btnOpenOrClose.Text = "打开串口";
  79. }
  80. else if (port == null)
  81. {
  82. port = new SerialPort();
  83. port.BaudRate =Convert.ToInt32(txtBaudRate.EditValue);
  84. port.PortName = txtCom.EditValue.ToString();
  85. if (txtDataBits.EditValue != null)
  86. port.DataBits = Convert.ToInt32(txtDataBits.EditValue);
  87. if (txtParitv.EditValue != null)
  88. {
  89. switch(txtParitv.EditValue.ToString())
  90. {
  91. case "None":
  92. port.Parity = Parity.None;
  93. break;
  94. case "Even":
  95. port.Parity = Parity.Even;
  96. break;
  97. case "Mark":
  98. port.Parity = Parity.Mark;
  99. break;
  100. case "Odd":
  101. port.Parity = Parity.Odd;
  102. break;
  103. case "Space":
  104. port.Parity = Parity.Space;
  105. break;
  106. }
  107. }
  108. if (txtStop.EditValue != null)
  109. {
  110. switch (txtParitv.EditValue.ToString())
  111. {
  112. case "0":
  113. port.StopBits = StopBits.None;
  114. break;
  115. case "1":
  116. port.StopBits = StopBits.One;
  117. break;
  118. case "2":
  119. port.StopBits = StopBits.Two;
  120. break;
  121. case "1.5":
  122. port.StopBits = StopBits.OnePointFive;
  123. break;
  124. }
  125. }
  126. if (txtXonXoff.EditValue.ToString() == "On")
  127. port.Handshake = Handshake.XOnXOff;
  128. else
  129. port.Handshake = Handshake.None;
  130. port.DataReceived += (object senders, SerialDataReceivedEventArgs es) =>
  131. {
  132. var returns = port.ReadLine();
  133. SetRichTextboxContent(RTBox_Log, "接收:"+returns, true);
  134. if(IsHexFormat(returns.Replace(" ","").Replace("\r","").Replace("\n","")))
  135. {
  136. returns = HexToString(returns.Replace("\r", "").Replace("\n", ""));//如果是16进制数据 转为字符串
  137. }
  138. if (returns.StartsWith("ST")||returns.StartsWith("US")|| returns.StartsWith("OV"))
  139. {
  140. this.txtResult.Invoke(new Action(() =>
  141. {
  142. var value= returns.Substring(7, 10).Replace(" ", "");
  143. if(!value.ToUpper().EndsWith("KG")&& !value.ToUpper().EndsWith("G"))
  144. SetRichTextboxContent(RTBox_Log1, "返回重量格式不正确,请调试致KG/G再称重!当前值:"+value+"", true);
  145. this.txtResult.Text = value;
  146. }));
  147. }
  148. };
  149. port.Open();
  150. SetRichTextboxContent(RTBox_Log1, "打开成功", true);
  151. btnOpenOrClose.Text = "关闭串口";
  152. foreach (var control in groupBox1.Controls)
  153. {
  154. if (control is ComboBoxEdit)
  155. ((ComboBoxEdit)control).Properties.ReadOnly = true;
  156. }
  157. }
  158. }
  159. catch (Exception ex)
  160. {
  161. SetRichTextboxContent(RTBox_Log1, ex.Message, false);
  162. if (port.IsOpen)
  163. port.Close();
  164. port = null;
  165. }
  166. }
  167. private void CheckPort()
  168. {
  169. try
  170. {
  171. if (txtCom.EditValue == null)
  172. throw new Exception("请先选择通讯口");
  173. if (txtBaudRate.EditValue == null)
  174. throw new Exception("请先选择波特率");
  175. if (txtDataBits.EditValue == null)
  176. throw new Exception("请先选择数据位");
  177. }
  178. catch (Exception ex)
  179. {
  180. throw ex;
  181. }
  182. }
  183. private void btnEditDel_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
  184. {
  185. try
  186. {
  187. }
  188. catch (Exception ex)
  189. {
  190. ICSBaseSimpleCode.AppshowMessageBox(ex.Message);
  191. }
  192. }
  193. private void btnCancle_Click(object sender, EventArgs e)
  194. {
  195. this.DialogResult = DialogResult.Cancel;
  196. this.Close();
  197. }
  198. private void btnClose_Click(object sender, EventArgs e)
  199. {
  200. if (this.port != null)
  201. this.port.Dispose();
  202. this.DialogResult = DialogResult.Cancel;
  203. this.Close();
  204. }
  205. private void groupBox1_Enter(object sender, EventArgs e)
  206. {
  207. }
  208. /// <summary>
  209. /// RichTextBox记录
  210. /// </summary>
  211. /// <param name="rtb">RichTextBox</param>
  212. /// <param name="txt1">基本信息</param>
  213. /// <param name="ok">Pass Or Fail</param>
  214. /// <param name="keys">特殊颜色所标识的关键字列表</param>
  215. private void SetRichTextboxContent(RichTextBox rtb, string txt1, bool ok = true, params string[] keys)
  216. {
  217. if (rtb.InvokeRequired)
  218. {
  219. rtb.Invoke(new Action(() => { SetRichTextboxContent(rtb, txt1, ok, keys); }));
  220. }
  221. else
  222. {
  223. if (rtb.Lines.Length > 200)
  224. {
  225. rtb.Clear();
  226. }
  227. rtb.SelectionColor = Color.Black;
  228. rtb.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff "));
  229. rtb.SelectionColor = ok ? Color.LimeGreen : Color.Red;
  230. rtb.AppendText(txt1);
  231. for (int i = 0; i < keys.Length; i++)
  232. {
  233. rtb.SelectionColor = color[i];
  234. rtb.AppendText(" " + keys[i]);
  235. }
  236. rtb.AppendText("\r\n");
  237. rtb.SelectionStart = rtb.Text.Length;
  238. rtb.ScrollToCaret();
  239. }
  240. }
  241. public void SendCommand(string command)
  242. {
  243. try
  244. {
  245. if (port.IsOpen)
  246. {
  247. port.WriteLine(command); // 发送指令
  248. }
  249. else
  250. {
  251. throw new Exception("串口未打开.");
  252. }
  253. SetRichTextboxContent(RTBox_Log, "发送:"+command , false);
  254. }
  255. catch (Exception ex)
  256. {
  257. SetRichTextboxContent(RTBox_Log1, "发送指令时出错: " + ex.Message, false);
  258. }
  259. }
  260. string StringToHex(string input)
  261. {
  262. StringBuilder sb = new StringBuilder();
  263. foreach (char c in input)
  264. {
  265. sb.Append(Convert.ToInt32(c).ToString("X2")).Append(" ");
  266. }
  267. return sb.ToString();
  268. }
  269. string HexToString(string hex)
  270. {
  271. string[] hexValuesSplit = hex.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  272. StringBuilder sb = new StringBuilder();
  273. foreach (string hexValue in hexValuesSplit)
  274. {
  275. sb.Append((char)Convert.ToInt32(hexValue, 16));
  276. }
  277. return sb.ToString();
  278. }
  279. private void groupBox2_Enter(object sender, EventArgs e)
  280. {
  281. }
  282. // 判断字符串是否是十六进制格式
  283. static bool IsHexFormat(string data)
  284. {
  285. foreach (char c in data)
  286. {
  287. if (!Uri.IsHexDigit(c))
  288. {
  289. return false;
  290. }
  291. }
  292. return true;
  293. }
  294. private void Common_Click(object sender, EventArgs e)
  295. {
  296. try
  297. {
  298. if ((sender as Control).Tag == null)
  299. return;
  300. if (port == null || !port.IsOpen)
  301. return;
  302. SendCommand((sender as Control).Tag.ToString()+"\r\n");//发送指令
  303. }
  304. catch ( Exception ex)
  305. {
  306. SetRichTextboxContent(RTBox_Log1, ex.Message, false);
  307. }
  308. }
  309. }
  310. }