C#-Modbus RTU通信-RFID读写器


项目要用高频的RFID读写器,当时看的那种工业级的比较贵,先买了几个普通的用

读写器接线的时候串口接到电脑上识别不了,后来发现要把GND接到24V开关电源的PE上,可能是公共端不一样信号电平读写器识别不了

读写器买的昱闵科技的,客服人不错,但给的资料里面有些寄存器没用,可能是读写器型号的问题

记录一下调试过程

  读卡号需要设置40011寄存器,卡号储存在40033-40034中,卡放在读卡器上就一直读

  读数据块需要设置40061,卡放在读卡器上只能读一次,发送下一个读数据块命令后40097-40105才有数据

 

然后贴一下程序,记不清抄的哪篇了,自己改过,里面轮询之类的程序还没写完,之后再补  

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO.Ports;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading;
  7 using System.Threading.Tasks;
  8 using System.Windows;
  9 using System.Windows.Controls;
 10 using System.Windows.Data;
 11 using System.Windows.Documents;
 12 using System.Windows.Forms;
 13 using System.Windows.Input;
 14 using System.Windows.Media;
 15 using System.Windows.Media.Imaging;
 16 using System.Windows.Navigation;
 17 using System.Windows.Shapes;
 18 using Modbus.Device;
 19 using MessageBox = System.Windows.MessageBox;
 20 
 21 namespace RFID_MODBUS_RTU
 22 {
 23     /// <summary>
 24     /// MainWindow.xaml 的交互逻辑
 25     /// </summary>
 26     public partial class MainWindow : Window
 27     {
 28         #region 读写器参数配置
 29         private static IModbusMaster master;
 30         private static SerialPort port;
 31         //写线圈或写寄存器数组
 32         private bool[] coilsBuffer;
 33         private ushort[] registerBuffer;
 34         //功能码
 35         private string functionCode;
 36         //功能码序号
 37         private int functionOder;
 38         //参数(分别为从站地址,起始地址,长度)
 39         private byte slaveAddress;
 40         private ushort startAddress;
 41         private ushort numberOfPoints;
 42         //串口参数
 43         private string portName;
 44         private int baudRate;
 45         private Parity parity;
 46         private int dataBits;
 47         private StopBits stopBits;
 48         //自动测试标志位
 49         private bool AutoFlag = false;
 50 
 51 
 52         //获取当前时间
 53         private System.DateTime Current_time;
 54 
 55 
 56         //定时器初始化
 57         private System.Timers.Timer t = new System.Timers.Timer(1000);
 58 
 59         private const int WM_DEVICE_CHANGE = 0x219;            //设备改变           
 60         private const int DBT_DEVICEARRIVAL = 0x8000;          //设备插入
 61         private const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //设备移除
 62         #endregion
 63 
 64         /// <summary>
 65         /// 界面初始化
 66         /// </summary>
 67         public MainWindow()
 68         {
 69             InitializeComponent();
 70         }
 71         /// <summary>
 72         /// 界面加载
 73         /// </summary>
 74         /// <param name="sender"></param>
 75         /// <param name="e"></param>
 76         private void Grid_Loaded(object sender, RoutedEventArgs e)
 77         {
 78             GetSerialLstTb1();
 79 
 80             cmb_baud.Items.Add("9600");
 81             cmb_baud.Items.Add("14400");
 82             cmb_baud.Items.Add("19200");
 83 
 84             cmb_parity.Items.Add("");
 85             cmb_parity.Items.Add("");
 86             cmb_parity.Items.Add("");
 87 
 88             cmb_dataBits.Items.Add("7");
 89             cmb_dataBits.Items.Add("8");
 90 
 91             cmb_stopBits.Items.Add("1");
 92             cmb_stopBits.Items.Add("2");
 93 
 94             cmb_function.Items.Add("01 Read Coils");
 95             cmb_function.Items.Add("02 Read DisCrete Inputs");
 96             cmb_function.Items.Add("03 Read Holding Registers");
 97             cmb_function.Items.Add("04 Read Input Registers");
 98             cmb_function.Items.Add("05 Write Single Coil");
 99             cmb_function.Items.Add("06 Write Single Registers");
100             cmb_function.Items.Add("0F Write Multiple Coils");
101             cmb_function.Items.Add("10 Write Multiple Registers");
102 
103             cmb_portname.SelectedIndex = -1;
104             cmb_baud.SelectedIndex = 0;
105             cmb_parity.SelectedIndex = 2;
106             cmb_dataBits.SelectedIndex = 1;
107             cmb_stopBits.SelectedIndex = 0;
108 
109             cmb_function.SelectedIndex = 0;
110 
111         }
112         #region 串口下拉列表刷新
113         /// <summary>
114         /// 刷新串口下拉列表显示
115         /// </summary>
116         private void GetSerialLstTb1()
117         {
118             //清除cmb_portname显示
119             cmb_portname.SelectedIndex = -1;
120             cmb_portname.Items.Clear();
121             string[] serialLst = SerialPort.GetPortNames();
122             if (serialLst.Length > 0)
123             {
124                 //取串口进行排序
125                 Array.Sort(serialLst);
126                 //将串口列表输出到cmb_portname
127                 for (int i = 0; i < serialLst.Length; i++)
128                 {
129                     cmb_portname.Items.Add(serialLst[i]);
130                     cmb_portname.SelectedIndex = 0;
131                 }
132             }
133         }
134         /// <summary>
135         /// 鼠标移入串口cmb触发刷新
136         /// </summary>
137         /// <param name="sender"></param>
138         /// <param name="e"></param>
139         private void cmb_portname_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
140         {
141             GetSerialLstTb1();
142         }
143         #endregion
144 
145         #region 定时器
146         //定时器初始化,失能状态
147         private void init_Timer()
148         {
149             t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);
150             t.AutoReset = true;//设置false定时器执行一次,设置true定时器一直执行
151             t.Enabled = false;//定时器使能true,失能false
152         }
153 
154         private void Execute(object source, System.Timers.ElapsedEventArgs e)
155         {
156             //停止定时器后再打开定时器,避免重复打开
157             t.Stop();
158             //ExecuteFunction();可添加执行操作
159             t.Start();
160         }
161         #endregion
162 
163         #region 串口配置
164         /// <summary>
165         /// 串口参数获取
166         /// </summary>
167         /// <returns></返回串口配置参数>
168         private SerialPort InitSerialPortParameter()
169         {
170             if (cmb_portname.SelectedIndex < 0 || cmb_baud.SelectedIndex < 0 || cmb_parity.SelectedIndex < 0 || cmb_dataBits.SelectedIndex < 0 || cmb_stopBits.SelectedIndex < 0)
171             {
172                 MessageBox.Show("请选择串口参数");
173                 return null;
174             }
175             else
176             {
177                 portName = cmb_portname.SelectedItem.ToString();
178                 baudRate = int.Parse(cmb_baud.SelectedItem.ToString());
179 
180                 switch (cmb_parity.SelectedItem.ToString())
181                 {
182                     case "":
183                         parity = Parity.Odd;
184                         break;
185                     case "":
186                         parity = Parity.Even;
187                         break;
188                     case "":
189                         parity = Parity.None;
190                         break;
191                     default:
192                         break;
193                 }
194                 dataBits = int.Parse(cmb_dataBits.SelectedItem.ToString());
195                 switch (cmb_stopBits.SelectedItem.ToString())
196                 {
197                     case "1":
198                         stopBits = StopBits.One;
199                         break;
200                     case "2":
201                         stopBits = StopBits.Two;
202                         break;
203                     default:
204                         break;
205                 }
206 
207                 port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
208                 return port;
209 
210             }
211         }
212         #endregion
213 
214         #region 读写参数设置
215         /// <summary>
216         /// 设置读参数
217         /// </summary>
218         private void SetReadParameters()
219         {
220             if (txt_startAddr_read.Text == "" || txt_slave_read.Text == "" || txt_length_read.Text == "")
221             {
222                 MessageBox.Show("请填写读参数!");
223             }
224             else
225             {
226                 slaveAddress = byte.Parse(txt_slave_read.Text);
227                 startAddress = ushort.Parse(txt_startAddr_read.Text);
228                 numberOfPoints = ushort.Parse(txt_length_read.Text);
229             }
230         }
231 
232         /// <summary>
233         /// 设置写参数
234         /// </summary>
235         private void SetWriteParametes()
236         {
237             if (txt_startAddr_write.Text == "" || txt_slave_write.Text == "" || txt_data_write.Text == "")
238             {
239                 MessageBox.Show("请填写写参数!");
240             }
241             else
242             {
243                 slaveAddress = byte.Parse(txt_slave_write.Text);
244                 startAddress = ushort.Parse(txt_startAddr_write.Text);
245                 //判断是否写线圈
246                 if (functionOder == 4 || functionOder == 6)
247                 {
248                     string[] strarr = txt_data_write.Text.Split(' ');
249                     coilsBuffer = new bool[strarr.Length];
250                     //转化为bool数组
251                     for (int i = 0; i < strarr.Length; i++)
252                     {
253                         // strarr[i] == "0" ? coilsBuffer[i] = false : coilsBuffer[i] = true;
254                         if (strarr[i] == "0")
255                         {
256                             coilsBuffer[i] = false;
257                         }
258                         else
259                         {
260                             coilsBuffer[i] = true;
261                         }
262                     }
263                 }
264                 else
265                 {
266                     //转化ushort数组
267                     string[] strarr = txt_data_write.Text.Split(' ');
268                     registerBuffer = new ushort[strarr.Length];
269                     for (int i = 0; i < strarr.Length; i++)
270                     {
271                         //registerBuffer[i] = ushort.Parse(strarr[i]);
272                         registerBuffer[i] = ushort.Parse(strarr[i], System.Globalization.NumberStyles.HexNumber);
273                         //Convert.ToUInt16(strarr[i]);
274                         //SetMsg(registerBuffer[i].ToString());
275                     }
276                 }
277             }
278         }
279         #endregion
280 
281         #region 数据区操作
282         /// <summary>
283         /// 创建委托,打印日志
284         /// </summary>
285         /// <param name="msg"></param>
286         public void SetMsg(string msg)
287         {
288             data_view.Dispatcher.Invoke(new Action(() => { data_view.AppendText(msg); }));
289         }
290         /// <summary>
291         /// 双击清空数据区
292         /// </summary>
293         /// <param name="sender"></param>
294         /// <param name="e"></param>
295         private void data_view_MouseDoubleClick(object sender, MouseButtonEventArgs e)
296         {
297             data_view.Document.Blocks.Clear();
298         }
299         /// <summary>
300         /// 将打印日志显示到最新接收到的符号位置
301         /// </summary>
302         /// <param name="sender"></param>
303         /// <param name="e"></param>
304         private void data_view_TextChanged(object sender, TextChangedEventArgs e)
305         {
306             this.data_view.ScrollToEnd();
307         }
308         #endregion
309 
310         #region 串口收/发
311         private async void ExecuteFunction()
312         {
313             Current_time = System.DateTime.Now;
314             try
315             {
316                 if (port.IsOpen == false)
317                 {
318                     port.Open();
319                 }
320                 if (functionCode != null)
321                 {
322                     switch (functionCode)
323                     {
324                         case "01 Read Coils"://读取单个线圈
325                             SetReadParameters();
326                             try
327                             {
328                                 coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);
329                             }
330                             catch (Exception)
331                             {
332                                 MessageBox.Show("参数配置错误");
333                                 //MessageBox.Show(e.Message);
334                                 AutoFlag = false;
335                                 break;
336                             }
337                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
338                             for (int i = 0; i < coilsBuffer.Length; i++)
339                             {
340                                 SetMsg(coilsBuffer[i] + " ");
341                             }
342                             SetMsg("\r\n");
343                             break;
344                         case "02 Read DisCrete Inputs"://读取输入线圈/离散量线圈
345                             SetReadParameters();
346                             try
347                             {
348                                 coilsBuffer = master.ReadInputs(slaveAddress, startAddress, numberOfPoints);
349                             }
350                             catch (Exception)
351                             {
352                                 MessageBox.Show("参数配置错误");
353                                 AutoFlag = false;
354                                 break;
355                             }
356                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
357                             for (int i = 0; i < coilsBuffer.Length; i++)
358                             {
359                                 SetMsg(coilsBuffer[i] + " ");
360                             }
361                             SetMsg("\r\n");
362                             break;
363                         case "03 Read Holding Registers"://读取保持寄存器
364                             SetReadParameters();
365                             try
366                             {
367                                 registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
368                             }
369                             catch (Exception)
370                             {
371                                 MessageBox.Show("参数配置错误");
372                                 AutoFlag = false;
373                                 break;
374                             }
375                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
376                             for (int i = 0; i < registerBuffer.Length; i++)
377                             {
378                                 SetMsg(registerBuffer[i].ToString("X4") + " ");
379                             }
380                             SetMsg("\r\n");
381                             break;
382                         case "04 Read Input Registers"://读取输入寄存器
383                             SetReadParameters();
384                             try
385                             {
386                                 registerBuffer = master.ReadInputRegisters(slaveAddress, startAddress, numberOfPoints);
387                             }
388                             catch (Exception)
389                             {
390                                 MessageBox.Show("参数配置错误");
391                                 AutoFlag = false;
392                                 break;
393                             }
394                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
395                             for (int i = 0; i < registerBuffer.Length; i++)
396                             {
397                                 SetMsg(registerBuffer[i] + " ");
398                             }
399                             SetMsg("\r\n");
400                             break;
401                         case "05 Write Single Coil"://写单个线圈
402                             SetWriteParametes();
403                             await master.WriteSingleCoilAsync(slaveAddress, startAddress, coilsBuffer[0]);
404                             break;
405                         case "06 Write Single Registers"://写单个输入线圈/离散量线圈
406                             SetWriteParametes();
407                             await master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
408                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
409                             for (int i = 0; i < registerBuffer.Length; i++)
410                             {
411                                 SetMsg(registerBuffer[i].ToString("X4") + " ");
412                             }
413                             SetMsg("\r\n");
414                             break;
415                         case "0F Write Multiple Coils"://写一组线圈
416                             SetWriteParametes();
417                             await master.WriteMultipleCoilsAsync(slaveAddress, startAddress, coilsBuffer);
418                             break;
419                         case "10 Write Multiple Registers"://写一组保持寄存器
420                             SetWriteParametes();
421                             await master.WriteMultipleRegistersAsync(slaveAddress, startAddress, registerBuffer);
422                             SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
423                             for (int i = 0; i < registerBuffer.Length; i++)
424                             {
425                                 SetMsg(registerBuffer[i].ToString("X4") + " ");
426                             }
427                             SetMsg("\r\n");
428                             break;
429                         default:
430                             break;
431                     }
432 
433                 }
434                 else
435                 {
436                     MessageBox.Show("请选择功能码!");
437                 }
438                 port.Close();
439             }
440             catch (Exception ex)
441             {
442                 port.Close();
443                 MessageBox.Show(ex.Message);
444             }
445         }
446 
447         #endregion
448 
449         #region 按钮事件
450         /// <summary>
451         /// 单击,串口完成一次读/写操作
452         /// </summary>
453         /// <param name="sender"></param>
454         /// <param name="e"></param>
455         private void read_write_Click(object sender, RoutedEventArgs e)
456         {
457             //AutoFlag = false;
458             //button_AutomaticTest.Enabled = true;
459             try
460             {
461                 //初始化串口参数
462                 master = ModbusSerialMaster.CreateRtu(port);
463                 ExecuteFunction();
464             }
465             catch (Exception)
466             {
467                 MessageBox.Show("初始化异常");
468             }
469         }
470 
471         /// <summary>
472         /// 自动测试初始化
473         /// </summary>
474         private void AutomaticTest()
475         {
476             AutoFlag = true;
477             btn_read_write.IsEnabled = false;
478 
479             InitSerialPortParameter();
480             master = ModbusSerialMaster.CreateRtu(port);
481 
482             Task.Factory.StartNew(() =>
483             {
484                 //初始化串口参数
485 
486                 while (AutoFlag)
487                 {
488 
489                     try
490                     {
491 
492                         ExecuteFunction();
493 
494                     }
495                     catch (Exception)
496                     {
497                         MessageBox.Show("初始化异常");
498                     }
499                     Thread.Sleep(500);
500                 }
501             });
502         }
503         /// <summary>
504         /// 读取数据时,失能写数据;写数据时,失能读数据
505         /// </summary>
506         /// <param name="sender"></param>
507         /// <param name="e"></param>
508         private void cmb_function_DropDownClosed(object sender, EventArgs e)
509         {
510             if (cmb_function.SelectedIndex >= 4)
511             {
512                 txt_data_write.IsEnabled = true;
513                 txt_slave_write.IsEnabled = true;
514                 txt_startAddr_write.IsEnabled = true;
515                 txt_length_read.IsEnabled = false;
516                 txt_slave_read.IsEnabled = false;
517                 txt_startAddr_read.IsEnabled = false;
518             }
519             else
520             {
521                 txt_data_write.IsEnabled = false;
522                 txt_slave_write.IsEnabled = false;
523                 txt_startAddr_write.IsEnabled = false;
524                 txt_length_read.IsEnabled = true;
525                 txt_slave_read.IsEnabled = true;
526                 txt_startAddr_read.IsEnabled = true;
527             }
528             //委托事件,在主线程中创建的控件,在子线程中读取设置控件的属性会出现异常,使用Invoke方法可以解决
529             cmb_function.Dispatcher.Invoke(new Action(() => { functionCode = cmb_function.SelectedItem.ToString(); functionOder = cmb_function.SelectedIndex; }));
530         }
531 
532         /// <summary>
533         /// 自动化测试
534         /// </summary>
535         /// <param name="sender"></param>
536         /// <param name="e"></param>
537         private void btn_autotest_Click(object sender, RoutedEventArgs e)
538         {
539             AutoFlag = false;
540             btn_autotest.IsEnabled = false; //自动收发按钮失能,避免从复开启线程
541             if (AutoFlag == false)
542             {
543                 AutomaticTest();
544 
545             }
546         }
547         /// <summary>
548         /// 串口开闭,开启/关闭读/写功能
549         /// </summary>
550         /// <param name="sender"></param>
551         /// <param name="e"></param>
552         private void btn_port_Click(object sender, RoutedEventArgs e)
553         {
554             if(cmb_portname.Items.Count !=0)
555             {
556                 InitSerialPortParameter();
557 
558                 try
559                 {
560                     if((string)btn_port.Content == "打开串口")
561                     {
562                         if(port.IsOpen == false)
563                         {
564 
565                             port.PortName = cmb_portname.Text;
566                                 
567                             port.BaudRate = int.Parse(cmb_baud.SelectedValue.ToString());
568                             port.Open();
569                             btn_port.Content = "关闭串口";
570                             cmb_portname.IsEnabled = false;
571                             cmb_baud.IsEnabled = false;
572                             cmb_dataBits.IsEnabled = false;
573                             cmb_parity.IsEnabled = false;
574                             cmb_stopBits.IsEnabled = false;
575                         }
576                     }
577                     else
578                     {
579                         if(port.IsOpen)
580                         {
581                             port.Close();
582                         }
583                         btn_port.Content = "打开串口";
584                         cmb_portname.IsEnabled = true;
585                         cmb_baud.IsEnabled = true;
586                         cmb_dataBits.IsEnabled = true;
587                         cmb_parity.IsEnabled = true;
588                         cmb_stopBits.IsEnabled = true;
589                     }
590                 }
591                 catch(Exception ex)
592                 {
593                     MessageBox.Show(ex.GetType().ToString());
594                     MessageBox.Show("端口被占用\n请选择正确的端口", "错误");
595                 }
596             }
597             else
598             {
599                 MessageBox.Show("请选择正确的端口", "错误");
600             }
601         }
602 
603         #region 轮询测试事件
604         /// <summary>
605         /// 轮询操作
606         /// </summary>
607         private void CycleExecuteFunction()
608         {
609             Current_time = System.DateTime.Now;
610             int a = 10;
611             while (a != 0)
612             {
613                 a--;
614 
615                 try
616                 {
617 
618                     if (port.IsOpen == false)
619                     {
620                         port.Open();
621                     }
622                     SetReadParameters();
623                     try
624                     {
625                         registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
626                     }
627                     catch (Exception)
628                     {
629                         MessageBox.Show("参数配置错误");
630                         AutoFlag = false;
631                         break;
632                     }
633                     SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
634                     for (int i = 0; i < registerBuffer.Length; i++)
635                     {
636                         SetMsg(registerBuffer[i] + " ");
637                     }
638                     SetMsg("\r\n");
639 
640                     port.Close();
641                 }
642                 catch (Exception ex)
643                 {
644                     port.Close();
645                     MessageBox.Show(ex.Message);
646                 }
647                 try
648                 {
649 
650                     if (port.IsOpen == false)
651                     {
652                         port.Open();
653                     }
654                     SetReadParameters();
655                     slaveAddress = byte.Parse("2");
656                     try
657                     {
658                         registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
659                     }
660                     catch (Exception)
661                     {
662                         MessageBox.Show("参数配置错误");
663                         AutoFlag = false;
664                         break;
665                     }
666                     SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
667                     for (int i = 0; i < registerBuffer.Length; i++)
668                     {
669                         SetMsg(registerBuffer[i] + " ");
670                     }
671                     SetMsg("\r\n");
672 
673                     port.Close();
674                 }
675                 catch (Exception ex)
676                 {
677                     port.Close();
678                     MessageBox.Show(ex.Message);
679                 }
680                 try
681                 {
682 
683                     if (port.IsOpen == false)
684                     {
685                         port.Open();
686                     }
687                     SetReadParameters();
688                     slaveAddress = byte.Parse("3");
689                     try
690                     {
691                         registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
692                     }
693                     catch (Exception)
694                     {
695                         MessageBox.Show("参数配置错误");
696                         AutoFlag = false;
697                         break;
698                     }
699                     SetMsg("[" + Current_time.ToString("yyyy-MM-dd HH:mm:ss" + "]" + " "));
700                     for (int i = 0; i < registerBuffer.Length; i++)
701                     {
702                         SetMsg(registerBuffer[i] + " ");
703                     }
704                     SetMsg("\r\n");
705 
706                     port.Close();
707                 }
708                 catch (Exception ex)
709                 {
710                     port.Close();
711                     MessageBox.Show(ex.Message);
712                 }
713             }
714         }
715         /// <summary>
716         /// 单击开始轮询
717         /// </summary>
718         /// <param name="sender"></param>
719         /// <param name="e"></param>
720         private void btn_cycle_text_Click(object sender, RoutedEventArgs e)
721         {
722             //AutoFlag = false;
723             //button_AutomaticTest.Enabled = true;
724 
725             try
726             {
727                 //初始化串口参数
728                 InitSerialPortParameter();
729 
730                 master = ModbusSerialMaster.CreateRtu(port);
731 
732                 CycleExecuteFunction();
733 
734             }
735             catch (Exception)
736             {
737                 MessageBox.Show("初始化异常");
738             }
739         }
740 
741 
742 
743 
744 
745         #endregion
746 
747         #endregion
748 
749         #region Dec和Hex互转
750 
751         private void btn_Dec_to_Hex_Click(object sender, RoutedEventArgs e)
752         {
753             string Dec = txt_Dec.Text;
754             try
755             {
756                 int Dec_int = int.Parse(Dec);
757                 String Hex = Dec_int.ToString("X");
758                 txt_Hex.Text = Hex;
759             }
760             catch (Exception ex)
761             {
762                 MessageBox.Show(ex.Message);
763             }
764         }
765         private void btn_Hex_to_Dec_Click(object sender, RoutedEventArgs e)
766         {
767             string Hex = txt_Hex.Text;
768             try
769             {
770                 int Dec = Convert.ToInt32(Hex, 16);
771                 txt_Dec.Text = Dec.ToString();
772             }
773             catch(Exception ex)
774             {
775                 MessageBox.Show(ex.Message);
776             }
777         }
778         #endregion
779 
780 
781     }
782 
783 
784 }

 

C#好在这个WPF和Winform写界面方便,但网上好多程序没贴界面的代码

 1 <Window x:Class="RFID_MODBUS_RTU.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:RFID_MODBUS_RTU"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="450" Width="800">
 9     <Grid Loaded="Grid_Loaded">
10         <GroupBox Header="读操作" HorizontalAlignment="Left" Height="54" Margin="10,152,0,0" VerticalAlignment="Top" Width="774">
11             <Label Content="从站号" HorizontalAlignment="Left" VerticalAlignment="Top"/>
12         </GroupBox>
13         <GroupBox Header="串口参数" HorizontalAlignment="Left" Height="50" Margin="10,10,0,0" VerticalAlignment="Top" Width="774"/>
14         <ComboBox x:Name="cmb_portname" HorizontalAlignment="Left" Margin="65,33,0,0" VerticalAlignment="Top" Width="95" MouseEnter="cmb_portname_MouseEnter"/>
15         <Label Content="波特率" HorizontalAlignment="Left" Margin="165,28,0,0" VerticalAlignment="Top" Height="27"/>
16         <ComboBox x:Name="cmb_baud" HorizontalAlignment="Left" Margin="216,33,0,0" VerticalAlignment="Top" Width="95"/>
17         <Label Content="校验方式" HorizontalAlignment="Left" Margin="316,28,0,0" VerticalAlignment="Top" Height="27"/>
18         <ComboBox x:Name="cmb_parity" HorizontalAlignment="Left" Margin="379,33,0,0" VerticalAlignment="Top" Width="95"/>
19         <Label Content="数据位" HorizontalAlignment="Left" Margin="479,28,0,0" VerticalAlignment="Top" Height="27"/>
20         <ComboBox x:Name="cmb_dataBits" HorizontalAlignment="Left" Margin="530,33,0,0" VerticalAlignment="Top" Width="95"/>
21         <Label Content="停止位" HorizontalAlignment="Left" Margin="630,28,0,0" VerticalAlignment="Top" Height="27"/>
22         <ComboBox x:Name="cmb_stopBits" HorizontalAlignment="Left" Margin="681,33,0,0" VerticalAlignment="Top" Width="100"/>
23         <Label Content="串口号" HorizontalAlignment="Left" Margin="14,28,0,0" VerticalAlignment="Top" Height="27"/>
24         <GroupBox Header="读写器功能区" HorizontalAlignment="Left" Height="82" Margin="10,65,0,0" VerticalAlignment="Top" Width="774">
25             <Label Content="功能码" HorizontalAlignment="Left" VerticalAlignment="Top" Height="27"/>
26         </GroupBox>
27         <ComboBox x:Name="cmb_function" HorizontalAlignment="Left" Margin="65,84,0,0" VerticalAlignment="Top" Width="95" DropDownClosed="cmb_function_DropDownClosed"/>
28         <GroupBox Header="写操作" HorizontalAlignment="Left" Height="54" Margin="10,211,0,0" VerticalAlignment="Top" Width="774"/>
29         <TextBox x:Name="txt_slave_read" HorizontalAlignment="Left" Height="23" Margin="65,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
30         <Label Content="起始地址" HorizontalAlignment="Left" Margin="190,167,0,0" VerticalAlignment="Top" Height="27"/>
31         <TextBox x:Name="txt_startAddr_read" HorizontalAlignment="Left" Height="23" Margin="252,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
32         <Label Content="长度" HorizontalAlignment="Left" Margin="379,167,0,0" VerticalAlignment="Top" Height="27"/>
33         <TextBox x:Name="txt_length_read" HorizontalAlignment="Left" Height="23" Margin="418,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
34         <Label Content="从站号" HorizontalAlignment="Left" Margin="14,227,0,0" VerticalAlignment="Top" Height="27"/>
35         <TextBox x:Name="txt_slave_write" HorizontalAlignment="Left" Height="23" Margin="65,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
36         <Label Content="起始地址" HorizontalAlignment="Left" Margin="190,223,0,0" VerticalAlignment="Top" Height="27"/>
37         <TextBox x:Name="txt_startAddr_write" HorizontalAlignment="Left" Height="23" Margin="253,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
38         <Label Content="数据数组" HorizontalAlignment="Left" Margin="379,223,0,0" VerticalAlignment="Top" Height="27"/>
39         <TextBox x:Name="txt_data_write" HorizontalAlignment="Left" Height="23" Margin="441,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="330"/>
40         <RichTextBox x:Name="data_view" HorizontalAlignment="Left" Height="140" Margin="10,270,0,0" VerticalAlignment="Top" Width="427" MouseDoubleClick="data_view_MouseDoubleClick" TextChanged="data_view_TextChanged">
41             <FlowDocument/>
42         </RichTextBox>
43         <Button x:Name="btn_read_write" Content="读/写" HorizontalAlignment="Left" Margin="181,87,0,0" VerticalAlignment="Top" Width="75" Click="read_write_Click"/>
44         <Button x:Name="btn_port" Content="打开串口" HorizontalAlignment="Left" Margin="271,87,0,0" VerticalAlignment="Top" Width="75" Click="btn_port_Click"/>
45         <Button x:Name="btn_autotest" Content="自动收发" HorizontalAlignment="Left" Margin="362,87,0,0" VerticalAlignment="Top" Width="75" Click="btn_autotest_Click"/>
46         <Button x:Name="btn_cycle_text" Content="轮询测试" HorizontalAlignment="Left" Margin="450,87,0,0" VerticalAlignment="Top" Width="75" Click="btn_cycle_text_Click"/>
47         <Label Content="Dec" HorizontalAlignment="Left" Margin="462,274,0,0" VerticalAlignment="Top" Height="27"/>
48         <TextBox x:Name="txt_Dec" HorizontalAlignment="Left" Height="23" Margin="513,274,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="180"/>
49         <TextBox x:Name="txt_Hex" HorizontalAlignment="Left" Height="23" Margin="513,302,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="180"/>
50         <Button x:Name="btn_Dec_to_Hex" Content="转换" HorizontalAlignment="Left" Margin="698,278,0,0" VerticalAlignment="Top" Width="75" Click="btn_Dec_to_Hex_Click"/>
51         <Button x:Name="btn_Hex_to_Dec" Content="转换" HorizontalAlignment="Left" Margin="698,306,0,0" VerticalAlignment="Top" Width="75" Click="btn_Hex_to_Dec_Click"/>
52         <Label Content="Hex&#xD;&#xA;" HorizontalAlignment="Left" Margin="462,298,0,0" VerticalAlignment="Top" Height="27"/>
53 
54 
55     </Grid>
56 </Window>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM