初学C#和nModbus,做了个窗体,然后button的click里放置如下建立slave的代码:
1 SerialPort slavePort = new SerialPort(m_connVariable.m_port); 2 slavePort.BaudRate = 9600; 3 slavePort.DataBits = 8; 4 slavePort.Parity = Parity.None; 5 slavePort.StopBits = StopBits.One; 6 slavePort.Open(); 7 8 byte unitId = 1; 9 m_ModbusSlave = ModbusSerialSlave.CreateRtu(unitId, slavePort); 10
11 m_ModbusSlave.DataStore = DataStoreFactory.CreateDefaultDataStore(); 12 m_ModbusSlave.Listen();
然后运行点击button后,程序不是假死未响应,就是出如下错:这是怎么回事,该怎么解决,或者该怎么写个slave端?
PS:相同的代码,但如果是console应用程序时,就没有问题?
串口操作,winform主线程UI容易卡死,用了委托来处理事件,就不影响了
Listen 里面是一个无限循环,会阻塞线程。也就是运行Listen以后永远没有返回,线程一直在执行Listen方法。Winform窗体里面事件处理代码默认是处于UI线程,所以程序会“假死未响应”,可以启动一个单独的线程来做Listen。
当你启动Console应用程序时,Console控制台可以理解为是一个单独的Winform程序,而你自己写的程序是没有UI线程的。在Console程序中执行Listen只阻塞了你自己的默认线程(与UI无关),Console的UI线程并没有被阻塞,所以不会出现假死。