为何串口的数据位,校验位,停止位设置无效?

问题描述

namespaceFB{publicpartialclassForm1:Form{bool_isReceiving;List<byte>buf=newList<byte>(4096);[DllImport("user32.dll",EntryPoint="SendMessageA")]publicstaticexternintSendMessage(IntPtrhwnd,intwMsg,intwParam,intlParam);[DllImport("user32.dll",EntryPoint="PosrMessageA")]publicstaticexternintPostMessage(IntPtrhwnd,intwMsg,intwParam,intlParam);//[DllImport("user32.dll",EntryPoint="SendMessageA")]//privatestaticexternintSendMessage(IntPtrhwnd,intwMsg,IntPtrwParam,stringlParam);//[DllImport("user32.dll",EntryPoint="SendMessageA")]//privatestaticexternintSendMessage(IntPtrhwnd,intwMsg,IntPtrwParam,refRectanglelParam);publicconstintWM_CHAR=0x0102;publicconstintWM_KEYDOWN=0x0100;publicForm1(){InitializeComponent();}privatevoidDispCommConfigParams(){toolStripStatusLabel1.Text=serialPort1.PortName+","+serialPort1.BaudRate.ToString()+","+serialPort1.DataBits.ToString()+","+serialPort1.Parity.ToString()+","+serialPort1.StopBits.ToString()+""+(serialPort1.IsOpen?"Opened":"Closed");}boolOpen(){serialPort1.PortName=cbPortName.SelectedItem.ToString();serialPort1.ReceivedBytesThreshold=1;serialPort1.WriteTimeout=1000;//写超时,如果底层串口驱动效率问题,能有效的避免死锁serialPort1.ReadTimeout=1000;//读超时,同上serialPort1.NewLine="rn";//新行的文本,用于WriteLine方法中由系统附加在text后serialPort1.Open();//打开串口button1.Text="关闭串口";//timer2.Enabled=true;TurnonLed();returnserialPort1.IsOpen;//返回打开结果}voidnewClose(){inti=Environment.TickCount;while(Environment.TickCount-i<2000&&_isReceiving)Application.DoEvents();button1.Text="打开串口";TurnoffLed();serialPort1.Close();//现在没有死锁了,关闭串口//timer2.Enabled=false;}//波特率privatevoidcbBautrate_SelectedIndexChanged(objectsender,EventArgse){if(serialPort1.IsOpen){Close();TurnoffLed();serialPort1.BaudRate=int.Parse(cbBautrate.Items[cbBautrate.SelectedIndex].ToString());Open();TurnonLed();}serialPort1.BaudRate=int.Parse(cbBautrate.Items[cbBautrate.SelectedIndex].ToString());DispCommConfigParams();}privatevoidcbDataByte_SelectedIndexChanged(objectsender,EventArgse){serialPort1.DataBits=int.Parse(cbDataByte.Items[cbDataByte.SelectedIndex].ToString());DispCommConfigParams();}//停止位privatevoidcbStopByte_SelectedIndexChanged(objectsender,EventArgse){switch(cbStopByte.SelectedIndex){case0:serialPort1.StopBits=System.IO.Ports.StopBits.One;break;case1:serialPort1.StopBits=System.IO.Ports.StopBits.OnePointFive;break;case2:serialPort1.StopBits=System.IO.Ports.StopBits.Two;break;}DispCommConfigParams();}//串口参数设置-波特率privatevoidcbValidByte_SelectedIndexChanged(objectsender,EventArgse){switch(cbValidByte.SelectedIndex){case0:serialPort1.Parity=System.IO.Ports.Parity.None;break;case1:serialPort1.Parity=System.IO.Ports.Parity.Odd;break;case2:serialPort1.Parity=System.IO.Ports.Parity.Even;break;case3:serialPort1.Parity=System.IO.Ports.Parity.Mark;break;case4:serialPort1.Parity=System.IO.Ports.Parity.Space;break;}DispCommConfigParams();}//枚举系统中的串口privatevoidEnumComportfromReg(ComboBoxCombobox){Combobox.Items.Clear();///定义注册表子PathstringstrRegPath=@"Hardware\DeviceMap\SerialComm";///创建两个RegistryKey类,一个将指向RootPath,另一个将指向子PathRegistryKeyregRootKey;RegistryKeyregSubKey;///定义Root指向注册表HKEY_LOCAL_MACHINE节点regRootKey=Registry.LocalMachine;///Registry枚举类提供了以下几种/*Registry.ClassesRoot-------------->指向注册表HKEY_CLASSES_ROOT节点Registry.CurrentConfig-------------->指向注册表HKEY_CURRENT_CONFIG节点Registry.CurrentUser-------------->指向注册表HKEY_CURRENT_USER节点Registry.DynData-------------->指向注册表HKEY_DYN_DATA节点(动态注册表数据)Registry.LocalMachine-------------->指向注册表HKEY_LOCAL_MACHINE节点Registry.PerformanceData-------------->指向注册表HKEY_PERFORMANCE_DATA节点Registry.Users-------------->指向注册表HKEY_USERS节点*/regSubKey=regRootKey.OpenSubKey(strRegPath);string[]strCommList=regSubKey.GetValueNames();foreach(stringVNameinstrCommList){//向listbox1中添加字符串的名称和数据,数据是从rk对象中的GetValue(it)方法中得来的Combobox.Items.Add(regSubKey.GetValue(VName));}if(Combobox.Items.Count>0)Combobox.SelectedIndex=0;///关闭regSubKey.Close();regRootKey.Close();}privatevoidTurnonLed(){picLedOff.Visible=false;picLedOn.Visible=true;}privatevoidTurnoffLed(){picLedOff.Visible=true;picLedOn.Visible=false;}//初始化串口参数选择框privatevoidInitComConfigCombobox(){cbBautrate.SelectedIndex=6;cbValidByte.SelectedIndex=2;cbStopByte.SelectedIndex=0;cbDataByte.SelectedIndex=3;}//串口开闭privatevoidbutton1_Click(objectsender,EventArgse){//如果串口没有打开,则先打开串口if(!serialPort1.IsOpen){serialPort1.BaudRate=int.Parse(cbBautrate.Items[cbBautrate.SelectedIndex].ToString());Open();}else{Close();}DispCommConfigParams();}在toolStripStatusLabel1,运行的时候发现串口号波特率是可以保存的,其他三个不能保存在toolStripStatusLabel1

解决方案

解决方案二:
你应该在button1_Click里设置所有的参数串口已经打开,不要随便关闭串口修改设置再打开串口
解决方案三:
而且如果你修改了参数但是不重新打开串口,这些参数根本不会生效
解决方案四:
您的意思,我的串口初始化,包括后来给数据位,停止位,校验位设置的那些命令是不是都要在button1底下完成?
解决方案五:
自己置顶一下,见谅。

时间: 2024-11-02 01:34:51

为何串口的数据位,校验位,停止位设置无效?的相关文章

64位-MFC程序读写并口时,什么避免状态寄存器10和11位高电平时的影响数据位和控制位的状态?

问题描述 MFC程序读写并口时,什么避免状态寄存器10和11位高电平时的影响数据位和控制位的状态? Win7 64位系统使用MFC程序读写并口时,发现并口状态位寄存器控制的10号.11号管脚为高电平时,并口数据位管脚电平被强制置低,控制位的14和17号管脚周期性跳变.经Google.百度查了发现并口有一套为打印机设计的一套通讯协议,但不知道什么去除通讯协议的影响.或者还有什么接口直接操作并口? 我目前的项目需要用并口与外部设备通讯,输入信号用到并口状态寄存器. 编程使用的接口是WinIo(下载网

C#中怎么接收串口发送数据的问题

问题描述 现有一个串口设备,波特率为9600,8位数据位,无校验位,1位停止位,通过UDP传输.我要写一个服务用UDP通讯来接收这个设备发给我的数据信息,然后要向设备发送信息,请教各位高手!~最好能有代码让小弟参考!~在此拜谢了!~ 解决方案 解决方案二:我想通过网络来接收和发送数据到设备!~不用串口通讯请各位大大们帮帮忙!~解决方案三:你用SerialPort就行了解决方案四:SerialPortspReceive=newSerialPort();//定义一个串口stringstrReciev

串口通信-android蓝牙串口接收数据

问题描述 android蓝牙串口接收数据 最近在做android手机蓝牙和单片机通信,一直被接收数据完整性这个问题困扰. 为了使一次通信的包保持完整,我就构思了发送12位的包,包头(1)+数据(8)+校验(2)+包尾(1),校验为求和校验.单片机发送数据的函数如下 void SendString(uchar *dat) //发送12位的包 包头(1)+数据(8)+校验(2)+包尾(1) { uchar i,j; uint check=0; //求和校验 SendChar(0x01); //0x0

串口通信-python serial write 串口发送数据出现问题 困扰了两天了

问题描述 python serial write 串口发送数据出现问题 困扰了两天了 发送端: 系统:ubuntu 14.04 $sudo chmod o+rwx /dev/ttyUSB0 $python 2.7.6-- import serial ser = serial.Serial('/dev/ttyUSB0',57600) ser.write('x01') 接收端: 系统windows 7 串口助手 波特率 57600 数据位 8 检验位 None 停止位 1 接收到的数据为(十六进制显

串口通信-VC串口接收数据编程,帮忙指导下

问题描述 VC串口接收数据编程,帮忙指导下 我是VC初学者,领导让做一个简单的串口通讯接收程序.不知道怎么做.具体要求如下:希望大神帮忙指导从何入手,该怎么写,谢谢 要求:要两个标志位的数a5.b6和四个实际数()()()()还有一个是00(以后用来显示温度的)[]帧计数(目标加1,最大255然后再返回0~255)最后一个数组就是前边除下a5所有的校验和. 标志位a5.b6 [][][][] 温度00 () () 上边就是所有的要求了 解决方案 http://blog.csdn.net/vela

C# 通过USR-WIFI232模块先DSP的串口发送数据??

问题描述 本人第一次使用C#语言,参考了各种资料之后稍微写了一个C#上位机程序.其功能是通过该上位机程序先DSP发送指令.其中上位机和DSP之间的串口使用USR-WIFI232-610进行连接.通过DSP串口直接和电脑连接,可以得到其DSP功能是完全正常的.并且利用了有人公司提供的测试软件,其同样也能发送指令,并将数据发送到我的测试软件中,如下图所示自己也写了一个TCP客户端程序,利用该上位机程序向该客户端发送数据,该客户端可以收到数据,并将发送数据返回!到这里为止都是正常的.但是只要向DSP发

在双硬盘上安装独立32位和64位双系统

现在的64位操作系统还没有中文版,加之受兼容性问题的影响,组建独立多系统显然已成为最佳的解决方案.很多朋友在配置64位硬件平台时已购入了SATA硬盘,但同时拥有SATA和PATA硬盘的朋友也不在少数,下面就来说明怎样在这两块硬盘上构建32位和64位Windows XP的独立双系统. 一.设置SATA硬盘 说明:本次用于试验的硬盘为: PATA接口的希捷40GB和SATA接口的希捷80GB硬盘各一块.怎样设置SATA硬盘,由主板决定,本文以硕泰克SL-K8AV2-R1L主板上的设置方法为例.各位朋

如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图(转)

window|程序 如何在 Java 应用程序中读取 8 位和 24 位 Microsoft Windows 位图在 Java 应用程序中加载位图文件的逐步指南 作者:Jeff West 和 John D. Mitchell 摘要目前,标准的 getImage() 方法仅支持 GIF 和 JPEG 图像.尽管存在用于读取 PNG(可移植网络图形)格式的 Java 例程,但我们还没听说过有用于读取 Microsoft Windows 位图图像的阅读程序.Jeff West 撰写的这篇技巧提供了加载

Windows Vista:32位和64位有什么区别

Windows Vista x64介绍 对于一般用户,肯定会考虑,既然现有32位版本的Windows还用的很好,干嘛要升级到64位呢,而且因为32位和64位的硬件(主要是CPU和主板)并不兼容,可能还要花费一笔不菲的费用.那么64位的优势何在?对于一般用户是否有必要升级到64位系统? Windows Vista x64 Edition 的设计初衷是:满足机械设计和分析.三维动画.视频编辑和创作以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户的需求. 专用技术应用程序的性能优势