当前位置: 首页 > news >正文

南昌企业网站建设哪家好大连网站设计培训班

南昌企业网站建设哪家好,大连网站设计培训班,网站开发交什么税,门户网站开发源代码目的 记录串口调试的遇到的一些问题以及相应的解决方法 1.串口定义:串口是计算机与其他硬件传输数据的通道#xff0c;在计算机与外设通信时起到重要作用 2.串口通信的基础知识 C#中的串口通信类 C#使用串口通信类是SerialPort(),该类使用方法是 new 一个 SerialPort对象 为S…目的 记录串口调试的遇到的一些问题以及相应的解决方法 1.串口定义:串口是计算机与其他硬件传输数据的通道在计算机与外设通信时起到重要作用 2.串口通信的基础知识 C#中的串口通信类 C#使用串口通信类是SerialPort(),该类使用方法是 new 一个 SerialPort对象 为SerialPort对象准备参数 _serialPort new SerialPort(portName);_serialPort.BaudRate bauRate;_serialPort.Parity parity;_serialPort.DataBits dataBits;_serialPort.StopBits stopBits;_serialPort.Handshake Handshake.None;_serialPort.ReadTimeout 500;_serialPort.WriteTimeout 500;接下来就是打开串口并且绑定事件 try{ErrorMessage ;_serialPort.Open();if (_serialPort.IsOpen){_serialPort.DataReceived new SerialDataReceivedEventHandler(DataReceivedHandler);return true;}else{Log.Debug($Truth_Power.SerialPortHelper.Open().Return [{false.ToString()}]);return false;}}catch(Exception ex){ErrorMessage ex.Message;Log.Error($Truth_Power.SerialPortHelper.Open().Error [{ex.Message}]);return false;}2.从串口读取数据 串口的性质不同于网络网络发一个HTTP会返回一个完整的数据。例如请求一个网页服务端就会返回完整的网页代码。 但是串口不同串口不一定一次返回完整的数据可能会分批次返回 例如我已知串口返回来的数据是10个字节但是第一次触发数据接收事件时可能返回5个第二次再触发事件时返回剩下的5个。这样串口需要一个数据合并的代码实例代码如下 private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs args){//端口缓冲区字节数本次数据到达的字节数int n _serialPort.BytesToRead;// Console.WriteLine(n);//将端口缓冲区数据存入字节数组byte[] byteRev new byte[n];_serialPort.Read(byteRev, 0, n);//将字节数组存入程序缓冲区string data BitConverter.ToString(byteRev);// RecieveBuffer data; if (IsRead){ReadBuffer -data; //拼接返回的数据}//if(ReadBuffer.Length 20) //如果数据长度合格则可以发出事件 这个事件不应该在回调中发出而是应该在writeRead函数中发出//{// ReceivedDataFromPort.Invoke(command, byteRev, n); //读出完整数据后再发出事件//}}public bool WriteAndRead(byte[] sendBytes, out string recieved, int timeOut 1000, int stepTime 20){IsRead true;ReadBuffer ;//公共变量recieved ;//clearInput(); //清空串口if (Write(sendBytes)){int times timeOut / stepTime;for (int i 0; i times; i){recieved ReadBuffer; //获取截止到当前串口返回的数据Thread.Sleep(stepTime); //这个延时一定要放在recived ReadBuffer之后如果20ms后ReadBuffer被更新那么received!ReadBuffer,这时就不会跳出循环if (recieved ) //如果这次读到是空先跳过等下次再读{continue;}if (recieved ReadBuffer) //当某次达到满数据后可以直接跳出循。跳出后判断i的值如果i达到times那么说明超时如果小于times那么没有超时{break;}}clearOutput();IsRead false;return true;}IsRead false;Log.Debug($Truth_Power.SerialPortHelper.WriteAndRead().Return [{false.ToString()}]);return false;}3.C#跨线程访问 C#跨线程访问需要特殊的处理 private void sendDataThread(){string fileName testdata.txt;StreamWriter sr;sr new StreamWriter(fileName);const int length 10; ;//发送与返回的字节长度int timeOut 1000; //超时时间int stepTime 20; //时间间隔int n 0; //当前接收的数据长度string hexString;//现在的问题就是数据没有写入string dataRev;byte[] dataRecv new byte[length];while (true){if (killed) //如果需要结束线程,那么用break跳出循环{sr.Close();break;}lock (Lock_Port){this.Dispatcher.Invoke(new Action(delegate{//你想要做的操作 ControlMode mode ((MainWindowViewModel)this.DataContext).CurrentSelectedMode;int electric ((MainWindowViewModel)this.DataContext).Electricity;int magetic ((MainWindowViewModel)this.DataContext).Magnetic;int voltage ((MainWindowViewModel)this.DataContext).Voltage;byte[] command;Listbyte data new Listbyte();switch (mode){case ControlMode.Voltage:SerialPortCommand.SetVoltage(voltage, Sign.PositiveSign, out command);//这里可能要先清空_serialPortControl.command command;_serialPortControl.Write(command.ToArray());_serialPortControl.WriteAndRead(command, out dataRev);timestamp DateTime.Now.ToString();hexString BitConverter.ToString(command);timestamp DateTime.Now.ToString();sr.WriteLine(接收时间);sr.WriteLine(timestamp);sr.WriteLine(发送数据);sr.WriteLine(hexString);// hexString BitConverter.ToString(receive);sr.WriteLine(接收数据);sr.WriteLine(dataRev);sr.WriteLine(接收数据长度);sr.WriteLine(dataRev.Length.ToString());sr.WriteLine(\n);break;case ControlMode.Magnetic:SerialPortCommand.SetMagetic(magetic);break;case ControlMode.Electricity:SerialPortCommand.SetElectric(electric, Sign.PositiveSign, out command);_serialPortControl.command command;_serialPortControl.WriteAndRead(command, out dataRev);timestamp DateTime.Now.ToString();hexString BitConverter.ToString(command);timestamp DateTime.Now.ToString();sr.WriteLine(接收时间);sr.WriteLine(timestamp);sr.WriteLine(发送数据);sr.WriteLine(hexString);// hexString BitConverter.ToString(receive);sr.WriteLine(接收数据);sr.WriteLine(dataRev);sr.WriteLine(接收数据长度);sr.WriteLine(dataRev.Length.ToString());sr.WriteLine(\n);break;}}));}Thread.Sleep(1000); //延时1秒保证电源有时间响应}4.串口指令生成 写串口实质上是向串口写入数据 数据本质上一串字节型数据一般有固定的格式。帧头-命令字-数据部分-帧尾值得关注就是数据部分。 以这个图片为例取出32位Int型数据的某八位可以用(移位)和(且) 如果取出高第二个字节 (byte)((dataLength 16) 0xFF) 如果取出Int型数据的低8位 (byte)(dataLength 0xFF)5.关于combox selectedChange事件 运行程序立即执行的问题 解决这个bug需要在切换事件中判断串口是否打开如果未打开则事件立即返回。代码如下 //选中的改变之后根据当前的选中值更新//核心获取改变之后的值if (!_isOpenForPort){MessageBox.Show(串口未打开);return;}6.返回重复数据的bug的原因 换成新的WriteAndRead函数后没有把原来的函数Write删掉 删掉这行代码之后串口接收到的数据就正常了
http://www.sadfv.cn/news/213704/

相关文章:

  • 做网站首选九零后网络wordpress文章目录
  • 家具网站模板下载吉林移动网站
  • 自建站需要多少钱玉林网站seo
  • 青海网站建设价格wordpress调用文章缩略图
  • 购物网站 系统设计seo是搜索引擎营销
  • 网站asp文件只读wordpress 提示插件安装插件
  • 制作网站软件哪个好北京企业网站制作哪家好
  • 举报不良网站信息怎么做怎么创建网站平台
  • 湖南企业做网站中国建筑模板十大名牌
  • wordpress文学主题青岛网站seo诊断
  • 广州建立网站的公司网站成都建设网站哪些公司好
  • 房地产类的网站建设网站建设网络
  • 个人静态网站首页怎么做培训心得体会800字
  • 用手机可以做网站商城网站建设运营合同
  • 阿里云网站注册如何建立一个个人博客网站
  • 大连免费建站模板南京网络营销公司
  • 南京做电商网站的公司简介平台运营需要多少钱
  • 影楼网站模板用自己的计算机做服务器建网站
  • 南京高端模板建站WordPress文章添加灯箱
  • 网站优化排名资源公司网站后台管理教程
  • 南京网站建设网手机网站菜单栏怎么做
  • 旅行网站建设的规划书网站建设亿玛酷技术
  • 资产管理公司网站建设费用怎么入账南头外贸网站建设公司
  • 网站建设分工案例移动端网站模板
  • 国内优秀企业网站设计西安高风险调整
  • 自己做商务网站有什么利弊企业网站推广推广阶段
  • 苏州的网络企业什么公司适合做seo优化
  • 金华网站建设优化技术海南房产
  • 什么公司做网站出名电商网站备案
  • 福田做棋牌网站建设哪家好如何在记事本中做网站链接