项目要用高频的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
" HorizontalAlignment="Left" Margin="462,298,0,0" VerticalAlignment="Top" Height="27"/> 53 54 55 </Grid> 56 </Window>