windows10系统中c#调用system.io.port SerialPort类不能通讯 1C

在Windows10系统中使用系统自带的控件SerialPort,通过串口发送数据,但仪器好像接收不到,没有返回数据.使用串口调试工具发送相同的字节,则仪器可以接收到并返回数据.
波特率及相关设置都一样,均为4800,N,8,1
但在windows7下相同的程序没有问题,仪器可以返回数据.
这是发送数据的代码如下:
serialPort1.BaudRate = 4800;
serialPort1.DataBits = 8;
serialPort1.StopBits = System.IO.Ports.StopBits.One;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.Open();

byte[] tbyte= new byte[] { 0xAA ,00 ,0x31 ,00 ,00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ,00,0xDB };
serialPort1.Write(tbyte, 0, tbyte.Length);

请各位大侠,帮助解决!
多谢!

2个回答

硬件最好用PCI串口卡,USB转串口的不是很好用.定义delegate发送,接收

初始化串口的时候怎么不设置超时?
根据我一些项目的经验,不设置超时应该是不可以的。
PortName = portName,
BaudRate = 38400,
DataBits = 8,
Parity = Parity.None,
StopBits = StopBits.One,
Handshake = Handshake.None,

**            ReadTimeout = 1000,**

** WriteTimeout = 1000**

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#串口打开报错System.IO.IOException: 函数不正确
1,第一次打开串口报错:System.UnauthorizedAccessException: Access to the port 'COM1' is denied. 2,然后通过设备管理器,禁用串口,在启动串口后 3再次打开串口,报错,System.IO.IOException: 函数不正确。 at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str) at System.IO.Ports.InternalResources.WinIOError() at System.IO.Ports.SerialStream.SetBufferSizes(Int32 readBufferSize, Int32 writeBufferSize) at System.IO.Ports.SerialPort.Open()
c#串口发送数据丢字节serialport
调用serialport.Write(array<Byte>[]()[], Int32, Int32)发送出去的数据没发全,丢了一些字节 ,不知道什么原因,感觉不止我一个人遇到
C#通过SerialPort读取电子天平数据时第一次操作无法获取数据,必须进行第二次操作才能获取当前数据?
C#通过SerialPort读取电子天平数据时,连接串口成功后,通过发送命令方式第一次操作无法获取数据,无任何数据返回,必须进行第二次操作才能获取当前数据。并且更新电子天平负载后,单击读取数据按钮,通过串口获得的数据为上一次读数,必须再单击一次才能获取更新的数据。一直卡到这里,不知道怎么解决,求大神帮忙看看!暂无积分,抱歉! using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Text.RegularExpressions; namespace 读天平 { public partial class Form1 : Form { SerialPort mySerialPort = null; string receiveing; string read_data; int count_read; int row_no; int column_no; DataGridView dgv; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { mySerialPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One); mySerialPort.Handshake = Handshake.None; // 四种都可以使用 mySerialPort.Open(); mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceivedHandler); mySerialPort.DtrEnable = true; // 加上此属性接收事件可被触发 mySerialPort.ReceivedBytesThreshold = 1; if (mySerialPort.IsOpen == true) { MessageBox.Show("串口打开成功", "提示", MessageBoxButtons.OK); } else { MessageBox.Show("串口打开失败", "提示", MessageBoxButtons.OK); } } private void mySerialPort_DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) // SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现 {//接收数据 SerialPort sp = (SerialPort)sender; read_data = sp.ReadExisting(); this.Invoke((EventHandler)(delegate { receiveing = read_data.Trim().TrimStart('+').TrimStart('-').TrimEnd('g').Trim(); })); mySerialPort.DiscardInBuffer(); // 清除接收缓存 } private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { byte[] send = { 0x1B, 0x70 }; // 十六进制ASCII码 mySerialPort.Write(send, 0, send.Length); row_no = e.RowIndex; column_no = e.ColumnIndex; dgv = dataGridView1; dgv.Rows[row_no].Cells[column_no].Value = receiveing; } private void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { byte[] send = { 0x1B, 0x70 }; // 十六进制ASCII码 mySerialPort.Write(send, 0, send.Length); row_no = e.RowIndex; column_no = e.ColumnIndex; dgv = dataGridView2; dgv.Rows[row_no].Cells[column_no].Value = receiveing; } } }
C#中的serialport.Write与MSCOMM控件的put_output有什么区别?
我使用C#上位机中的serialport.write发送数据 下位机收到的与上位机发送的数据不一样, 使用MSCOMM控件发送则没有问题, 求问有什么区别 (T^T)
c#如何hook拦截并屏蔽textbox里接收的消息,替换成自己指定的字符串?
1.一个程序里的窗口会接收com口或随机的字符串,想学习一下如何劫持这个窗口让它在接收前,先审核一下条件,后台运算后(比如+100)在到文本框。 2.小程序代码如下: ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading.Tasks; using System.IO.Ports; namespace text { public partial class Form1 : Form { public string receiveing = string.Empty; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { Random r = new Random(); textBox1.Text = r.Next(1000, 10000).ToString(); } private void button3_Click(object sender, EventArgs e) { timer1.Enabled = false; label1.Text = textBox1.Text+"保存成功!"; } private void serialPort2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { receiveing = serialPort2.ReadLine(); } private void Form1_Load(object sender, EventArgs e) { serialPort2.Open(); } private void button2_Click(object sender, EventArgs e) { textBox1.Text = receiveing; } } } ``` 3.要求大神提供c#hook程序的源代码,小白再次万分感谢 4.补充一下是通过您自己的程序代码起到作用,而不是修改我上面的代码,我的代码就是个测试的小程序
SerialPort串口通讯收到多余的数据
我有一C#编写的上位机软件与下位机通讯,下位机是C语言的程序,上位机的串口接收类是SerialPort,偶尔会有问题是会收到一些下位机程序中没有的数据,如00E4C8EBB5C4D0D4B1F03D300D0ACAE4C8EBB5C4D1AABAECB5B0B0D,请问这是什么原因?硬件中如串口或数据线或单片机会导致这样吗?还是说serialport这个类本身就不完善。
基于c#de串口通讯问题
我想实时获取从串口里面传输出来的字符串数据,可是为什么老是显示不出来呢,求高手解答,本人渣渣,谢谢了 ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { string data; Boolean status = false; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { serialPort1.PortName = "COM3"; serialPort1.BaudRate = 57600; serialPort1.Encoding = Encoding.BigEndianUnicode; serialPort1.Open(); } private void button2_Click(object sender, EventArgs e) { serialPort1.Close(); Close(); } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { data = serialPort1.ReadExisting(); this.Invoke(new EventHandler(DisplayText)); } private void DisplayText(object sender, EventArgs e) { char[] data1 = data.ToCharArray(); textBox1.Text = data1.ToString(); } } } ```
C# serialPort 串口连接modem通信 64位系统不能通信
C# serialPort 串口连接modem通信,在32位系统是能正常通信,当发布 64位系统不能通信了?请大牛啊!!
c#写一个上位机程序,用串口助手调试不出结果
![图片说明](https://img-ask.csdn.net/upload/201904/22/1555917610_948435.png)![图片说明](https://img-ask.csdn.net/upload/201904/22/1555917619_448897.png) 我用了论坛里搜到的代码,但是不全 ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); } private string[] portNames = null; private List<SerialPort> serialPorts; private byte[] portBuffer; private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { this.serialPorts = new List<SerialPort>(); this.portNames = SerialPort.GetPortNames(); this.portBuffer = new byte[1000]; //Assign the value of port names to serial ports display if (this.portNames.Length > 1) { for (int i = 0; i < this.portNames.Length; i++) { this.serialPorts.Add(new SerialPort(this.portNames[i])); } } this.comboBox1.Items.AddRange(this.portNames); this.comboBox2.Items.AddRange(this.portNames); } private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.Text.ToString()) { if (!this.serialPorts.ElementAt(i).IsOpen) { this.serialPorts.ElementAt(i).Open(); MessageBox.Show("已打开串口!"); } //this.serialPorts.ElementAt(i). } } catch (IOException eio) { MessageBox.Show("打开串口异常:" + eio); } } } private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.Text.ToString()) { if (this.serialPorts.ElementAt(i).IsOpen) { this.serialPorts.ElementAt(i).Close(); MessageBox.Show("已关闭串口!"); } } } catch (IOException eio) { MessageBox.Show("关闭串口异常:" + eio); } } } private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.Text.ToString()) { if (this.serialPorts.ElementAt(i).IsOpen) { string sendContent = this.textBox1.Text.ToString(); this.serialPorts.ElementAt(i).Write(sendContent); MessageBox.Show("已发送数据!"); } } } catch (IOException eio) { MessageBox.Show("串口发送异常:" + eio); } } } private void timer1_Tick(object sender, EventArgs e) { this.AddEventHandlerForResponse(); } private void AddEventHandlerForResponse() { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox2.Text.ToString()) { if ((this.serialPorts.ElementAt(i).IsOpen) && (this.serialPorts.ElementAt(i).BytesToRead > 0)) { this.serialPorts.ElementAt(i).Read(this.portBuffer, 0, this.serialPorts.ElementAt(i).BytesToRead); this.serialPorts.ElementAt(i).DataReceived += new SerialDataReceivedEventHandler(this.DataReceiveEventHandler); } } } catch (IOException eio) { MessageBox.Show("串口异常:" + eio); } } } private void DataReceiveEventHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; this.textBox2.Invoke( new MethodInvoker( delegate { this.textBox2.AppendText(sp.ReadExisting()); this.textBox2.Text += " "; } ) ); } private void button4_Click(object sender, EventArgs e) { } } } ``` 运行出来的结果,根本接收不到,求解哪里错了啊
c#编写的串口助手打开串口32单片机立刻黑屏,急求
using Microsoft.Win32; using System; using System.IO.Ports; using System.Windows.Forms; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; namespace WindowsFormsApp { public partial class Form1 : Form { //SerialPort sp = null;//声明一个串口类 bool isOpen = false;//打开串口标志位 bool isSetProperty = false;//属性设置标志位 bool isHex = false;//十六进制显示标志位 public Form1() { InitializeComponent(); System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性为false } //我们在form载入时,扫描识别存在的串口。 private void Form1_Load(object sender, EventArgs e) { this.MaximumSize = this.Size; this.MinimumSize = this.Size; this.MaximizeBox = false; RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); if (keyCom != null) { string[] sSubKeys = keyCom.GetValueNames(); cbxCOMPort.Items.Clear(); foreach (string sName in sSubKeys) { string sValue = (string)keyCom.GetValue(sName); cbxCOMPort.Items.Add(sValue); } if (cbxCOMPort.Items.Count > 0) cbxCOMPort.SelectedIndex = 0; else { cbxCOMPort.Text = ""; MessageBox.Show("没有找到可用串口!", "错误提示"); } } cbxBaudRate.SelectedIndex = 4; cbxStopBits.SelectedIndex = 1; cbxDataBits.SelectedIndex = 0; cbxParity.SelectedIndex = 0; rbnChar.Checked = true; } private void btnCheckCOM_Click(object sender, EventArgs e)//检测哪些串口可用 { RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); if (keyCom != null) { string[] sSubKeys = keyCom.GetValueNames(); cbxCOMPort.Items.Clear(); foreach (string sName in sSubKeys) { string sValue = (string)keyCom.GetValue(sName); cbxCOMPort.Items.Add(sValue); } if (cbxCOMPort.Items.Count > 0) cbxCOMPort.SelectedIndex = 0; else { cbxCOMPort.Text =""; MessageBox.Show("没有找到可用串口!", "错误提示"); } } } private bool CheckPortSetting()//检查串口是否设置 { if (cbxCOMPort.Text.Trim() == "") return false; if (cbxBaudRate.Text.Trim() == "") return false; if (cbxDataBits.Text.Trim() == "") return false; if (cbxParity.Text.Trim() == "") return false; if (cbxStopBits.Text.Trim() == "") return false; return true; } private bool CheckSendData() { if (tbxSendData.Text.Trim() == "") return false; return true; } private void SetPortProperty()//设置串口的属性 { serialPort.PortName = cbxCOMPort.Text.Trim();//设置串口名 serialPort.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());//设置串口的波特率 float f = Convert.ToSingle(cbxStopBits.Text.Trim());//设置停止位 if (f == 0) { serialPort.StopBits = StopBits.None; } else if (f == 1.5) { serialPort.StopBits = StopBits.OnePointFive; } else if (f == 1) { serialPort.StopBits = StopBits.One; } else if (f == 2) { serialPort.StopBits = StopBits.Two; } else { serialPort.StopBits = StopBits.One; } serialPort.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim());//设置数据位 string s = cbxParity.Text.Trim(); //设置奇偶校验位 if (s.CompareTo("无") == 0) { serialPort.Parity = Parity.None; } else if (s.CompareTo("奇校验") == 0) { serialPort.Parity = Parity.Odd; } else if (s.CompareTo("偶校验") == 0) { serialPort.Parity = Parity.Even; } else { serialPort.Parity = Parity.None; } serialPort.ReadTimeout = -1;//设置超时读取时间 serialPort.RtsEnable = true; //定义DataReceived 事件,当串口收到数据后触发事件 serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); if (rbnHex.Checked) { isHex = true; } else { isHex = false; } } private void btnOpenCom_Click(object sender, EventArgs e) { if (!isOpen) { if (!CheckPortSetting())//检测串口设置 { MessageBox.Show("串口未设置!", "错误提示"); return; } if (!isSetProperty)//串口未设置则设置串口 { SetPortProperty(); isSetProperty = true; } try { serialPort.Open(); //打开串口 btnOpenCom.Text = "关闭串口"; cbxCOMPort.Enabled = false;//关闭使能 cbxBaudRate.Enabled = false; cbxStopBits.Enabled = false; cbxParity.Enabled = false; cbxDataBits.Enabled = false; rbnChar.Enabled = false; rbnHex.Enabled = false; isOpen = true; serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);//串口接收处理函数 } catch { MessageBox.Show("串口打开失败!"); } } else { try { serialPort.Close(); //关闭串口 btnOpenCom.Text = "打开串口"; cbxCOMPort.Enabled = true;//打开使能 cbxBaudRate.Enabled = true; isOpen = false; } catch { MessageBox.Show("串口关闭失败!"); } } } //private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) //{ // string str = serialPort.ReadExisting();//字符串方式读 // tbxRecvData.Text = "";//先清除上一次的数据 // tbxRecvData.Text += str; //} private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { System.Threading.Thread.Sleep(100);//延时 100ms 等待接收完数据 //this.Invoke 就是跨线程访问 ui 的方法,也是本文的范例 this.Invoke((EventHandler)(delegate { if (isHex == false) { tbxRecvData.Text += serialPort.ReadLine(); } else { Byte[] ReceivedData = new Byte[serialPort.BytesToRead]; //创建接收字节数组 serialPort.Read(ReceivedData, 0, ReceivedData.Length); //读取所接收到的数据 String RecvDataText = null; for (int i = 0; i < ReceivedData.Length - 1; i++) { RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + " "); } tbxRecvData.Text += RecvDataText; } serialPort.DiscardInBuffer();//丢弃接收缓冲区数据 })); } private void btnSend_Click(object sender, EventArgs e) { //发送数据 if (serialPort.IsOpen) {//如果串口开启 if (tbxSendData.Text.Trim() != "")//如果框内不为空则 { serialPort.Write(tbxSendData.Text.Trim());//写数据 } else { MessageBox.Show("发送框没有数据"); } } else { MessageBox.Show("串口未打开"); } } private void btnCleanData_Click(object sender, EventArgs e) { tbxRecvData.Text = ""; tbxSendData.Text = ""; } } } 打开串口没有提示失败,但是单片机就不运行了。
C#上位机编写时遇到下位机数据传输问题。
![图片说明](https://img-ask.csdn.net/upload/201905/12/1557673198_357562.png) 然后C#提示是这里有问题: if (Convert.ToUInt16(serialPort1.ReadLine()) != 1820) 原程序为: private void button1_Click(object sender, EventArgs e) { try { if (isopen == false) { serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text); serialPort1.PortName = comboBox1.Text; serialPort1.Open(); serialPort1.Write("s"); if (Convert.ToUInt16(serialPort1.ReadLine()) != 1820) { MessageBox.Show("没找到设备"); return; } button1.Text = "停止采集"; 单片机下位机调试过已经是可以检测的了,就是上位机的问题,调试了之后问题是:WindowsApplication1.Form1.button1_Click(object sender = {未知}, System.EventArgs e = {未知}) C#这个object sender收不到东西,代码到底哪部分有问题啊??
Java通过得到的Socket流向串口发送数据
我是一个菜鸟,最近学习Java ,写了个向串口发送数据的代码,有点问题,希望各位大神给指点指点 ``` package server; import gnu.io.CommPortIdentifier; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import gnu.io.UnsupportedCommOperationException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.TooManyListenersException; import javax.lang.model.element.Parameterizable; import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; public class server extends Thread implements SerialPortEventListener { static Enumeration portList; //已经连接上的端口枚举 static CommPortIdentifier portId; //串口通信管理类 static SerialPort serialPort; //串口的引用 static OutputStream outputStream; static InputStream ins; static int count = 0; @SuppressWarnings("null") public static void main(String[] args) throws IOException { final ServerSocket s = new ServerSocket(12345); InetAddress addr = InetAddress.getLocalHost(); System.out.println("Ip地址为:"+addr.getHostAddress()); SerialPort port = PortsManager.getSerilPort("COM3", 2400); if(null==port) { System.out.println("串口为空!"); return; } try { port.setSerialPortParams(2400,SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_SPACE); } catch (UnsupportedCommOperationException e) { // TODO Auto-generated catch block e.printStackTrace(); } OutputStream outs = port.getOutputStream(); Socket ss = s.accept(); InputStream ins = ss.getInputStream(); byte[] b = new byte[8]; int len = -1; while((len = ins.read(b))!= -1){ count++; System.out.println("Socket 连接成功!"); System.out.println(b.toString()); if(count>2){ outs.write(b); } } } public void run(){ Thread th=new Thread(); th.start(); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //@Override public void serialEvent(SerialPortEvent arg0) { //TODO Auto-generated method stub try { serialPort.addEventListener(this);//注册一个SerialPortEventListener事件来监听串口事件 serialPort.notifyOnDataAvailable(true);//设置监听模式为当有数据到达时唤醒监听线程。 } catch (TooManyListenersException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ```
C# 不同控件调用同一方法出错。
private void btn_Record_Click(object sender, EventArgs e) { record(); } //在一个button上调用了一个record()方法。此方法可以正常使用 private void port_PinChanged(object sender, System.IO.Ports.SerialPinChangedEventArgs e) { switch (e.EventType) { case System.IO.Ports.SerialPinChange.DsrChanged: //开始录像 if (com.DsrHolding == true) { record(); } break; default: break; } //在一个SerialPort的PinChanged事件上也调用了一个record()方法。 但是为啥会报一下错误--------------------------- --------------------------- 无法将类型为“DirectShowLib.CaptureGraphBuilder2”的 COM 对象强制转换为接口类型“DirectShowLib.ICaptureGraphBuilder2”。此操作失败的原因是对 IID 为“{93E5A4E0-2D50-11D2-ABFA-00A0C9C6E38D}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。
求教关于C#serialPort串口控件使用后资源释放问题
在使用C#serialPort制作的串口调试器过程中发现的问题,希望能够描述清楚也希望有人能知道为什么会这样, 假设使用C#串口调试助手打开COM1之后再关闭com1之后直接使用com1口为单片机写程序,这样问题就来了, 只是能够正常打开串口但是却永远显示等待单片机响应,只有拔掉USB串口再重插或者使用网上下载的串口调试助手重新打开一次COM1在关闭才可以给单片机写入程序,不知道是什么问题,补充说明下如果不给单片机写程序的话只是使用串口测试收发那一切都正常,无论怎么打开关闭再打开都可以收发数据, 个人水平有限不知道为什么只是感觉上是C#serialPort控件打开再关闭之后没有彻底释放资源还有占用,我能想到的关闭方法只有下面这些了 试过关闭代码如下: serialPort1n.Close(); serialPort1n.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); 只是仍然是有问题,实际试了从网上下载的串口调试助手就没有我说的这个问题,下面是我打开串口的代码了: serialPort1n.Open();//打开串口 if (serialPort1n.IsOpen) { }
求大神告诉萌新 哪里有问题,怎么解决呢。。
using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace VNABLL { public class Comm { public delegate void EventHandle(string readBuffer); public event EventHandle DataReceived; private SerialPort serialPort; Thread thread; volatile bool _keepReading; public Comm() { if (serialPort == null) { serialPort = new SerialPort("COM3", 9600); this.serialPort.DiscardNull = true; this.serialPort.ReadTimeout = 10; this.serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); } thread = null; _keepReading = false; } public bool IsOpen { get { return serialPort.IsOpen; } } private void StartReading() { if (!_keepReading) { _keepReading = true; thread = new Thread(new ThreadStart(ReOpen)); thread.Start(); } } private void StopReading() { if (_keepReading) { _keepReading = false; thread.Join(); thread = null; } } readonly object obj = new object(); public void Open() { Close(); serialPort.Open(); if (serialPort.IsOpen) { StartReading(); } else { MessageBox.Show("串口打开失败!"); } } public void Close() { StopReading(); serialPort.Close(); } public bool WritePort(string sendMsg) { bool flag = false; try { if (serialPort.IsOpen) { serialPort.Write(sendMsg); flag = true; } else { flag = false; } } catch { flag = false; } return flag; } string str = ""; private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (serialPort.IsOpen) { System.Threading.Thread.Sleep(300); int count = serialPort.BytesToRead; if (count > 0) { byte[] readBuffer = new byte[count]; try { serialPort.Read(readBuffer, 0, count); if (string.IsNullOrEmpty(str)) str = System.Text.Encoding.Default.GetString(readBuffer); else str += System.Text.Encoding.Default.GetString(readBuffer); if (str.Contains("@XJ1") && str.Contains("#")) { if (DataReceived != null) DataReceived(str); str = ""; serialPort.DiscardInBuffer(); } if (str.Contains("@HJ1") && str.Contains("#")) { if (DataReceived != null) DataReceived(DecodeFire(readBuffer)); str = ""; serialPort.DiscardInBuffer(); } string DecodeFire(byte[] fetchbyte) { string head = str.Substring(0, 4); string end = str.Substring(29, 1); int x = (int)fetchbyte[4]; string[] decs = new string[24]; for (int i = 5; i < fetchbyte.Length - 1; i++) { int deci = (int)fetchbyte[i] - x + 9; //Array.Copy(System.Text.ASCIIEncoding.Default.GetBytes(deci.ToString()), 0, Bufferx, 0, 1); //decs[i-5] = System.Text.Encoding.ASCII.GetString(Bufferx); decs[i - 5] = deci.ToString(); } string sr = String.Join("", decs); string declast = head + sr + end; return declast; } } catch (TimeoutException) { } } } } private void ReOpen() { while (_keepReading) { Close(); serialPort.Open(); } } } } ``` ```
C# SerialPort 串口通信多线程问题
编程新手,想C# SerialPort实现串口通信,写的程序大概这样一个结构。发送一个数据后,要求收到下位机回复,超时发送下一个数据。要加一个发送和接收的线程,是加在主程序里面吗?大体的结构应该是怎么样的?求大神帮助!O(∩_∩)O谢谢! class SendAndReceive { SerialPort sp = new SerialPort(); public void SearchSet()//检测有哪些端口 public void PortSet()//端口设置 public void DataStartSend(byte[] sendbyte) { sp.Open(); //调用crc函数计算crc16的值 sp.Write(sendbyte, 0, sendbyte.Length); } public void DataReceive() { byte[] receivebyte=new byte[8]; sp.Read(receivebyte, 0, receivebyte.Length); //crc校验结果 } }
C# serport 与 stc80c51 单片机通信
用c#的serpoet类与51单片机通信 为什么收到的数据是错误的。 下位机代码#include<lcd.h> #include<duoji.h> #define uchar unsigned char #define uint unsigned int uint flag; uchar a; char receve[5],i=0; uint num; float angle; char table[10]="0123456789"; sbit led=P2^0; void chuankouinit() { TMOD=0x20; TH1=0xfd; TL1=0Xfd; TR1=1; REN=1; SM0=1; SM1=1; EA=1; ES=1; } /*--------------------------------------------------------------- 主函数 ----------------------------------------------------------------*/ void display(uint a,float b) { uint c; uchar d; d=' ' ; c=(int)b; LcdWriteData(table[a/10]); //lcd1602显示收到的第一个数 2位 delayms(5); LcdWriteData(table[a%10]); delayms(5); LcdWriteData(d); LcdWriteData(table[c/100]); //lcd1602显示收到的第2个数 3位 delayms(5); c%=100; LcdWriteData(table[c/10]); delayms(5); LcdWriteData(table[c%10]); delayms(5); } void datareceive() { int j; if(flag==1) { led=0; flag=0; angle=receve[0]; //第一个数 num=receve[1]; //第二个数 LcdWriteCom(0x80); display(num,angle); //LCD显示 for(j=0;j<5;j++) { receve[j]=0; } } } void main() { chuankouinit(); LcdInit(); I2Cinit(); begin(); setPWMFreq(); setPWM(0,0, 0) ; while(1) { datareceive(); } } void ser() interrupt 4 { RI=0; receve[i]=SBUF; i++; if(i==2) { i=0; flag=1; } } 上位机代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.Threading; namespace 串口App1 { public class PortChat { static SerialPort _serialPort; public static void Main() { byte[] b = new byte[2]; b[0] = 100; b[1] = 200; Console.Write("b[1] {0}", b[1]); // Create a new SerialPort object with default settings. _serialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _serialPort.Write(b,0,2); Console.Write(" message已发送 "); _serialPort.Close(); Console.ReadKey(); } } }
C#控制LED灯总算发送是失败
![图片说明](https://img-ask.csdn.net/upload/201504/10/1428636136_992123.png) 主程序 using LedDemo.Common; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace LedDemo { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void window_loaded(object sender, RoutedEventArgs e) { //定义数组aryPort,遍历数组 //GetPortNames方法,返回当前计算机可以用的端口 ,以数组的方式返回 string[] aryPort = SerialPort.GetPortNames(); foreach(string item in aryPort) { //将数组的项添加到下拉框的列表中 xl.Items.Add(item); } //设置默认的选择项为第一个找的项(端口) xl.SelectedIndex = 0; } /// <summary> /// Send and Save /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void b_Click(object sender, RoutedEventArgs e) { int speed = -1; //定义速度的值为-1; //定义一个布尔型, bool isSuccess = int.TryParse(sd.Text,out speed); //判断速度值得大小,是否在规定的范围内 if (isSuccess == false ||(speed <0 || speed>7)) { //弹出的对话框,提示信息; MessageBox.Show("请输入正确的值!(0--7)"); return; } LedCtrl led = new LedCtrl(xl.Text, speed); string msg = led.SendSaveMsg(sr.Text); MessageBox.Show(msg); } /// <summary> /// Send No Save /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nb_Click(object sender, RoutedEventArgs e) { int speed = -1; bool isSuccess = int.TryParse(sd.Text, out speed); if (isSuccess == false || (speed <0 || speed >7)) { MessageBox.Show("请输入正确的值! (0--7) "); return; } LedCtrl led = new LedCtrl(xl.Text,speed); string msg = led.SendMsg(sr.Text); MessageBox.Show(msg); } } } 类包 using ICS.Acquisition; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LedDemo.Common { public class LedCtrl { ICS.Acquisition.LEDAnalysis led = null; ICS.Acquisition.LedMessage ledMode = new ICS.Acquisition.LedMessage(); public LedCtrl(string serialNumber, int speed) { ICS.Models.Com.ComSettingModel com = new ICS.Models.Com.ComSettingModel(); com.LedCom = serialNumber; led = ClassFactory.GetProvider(equipmentCategory.LEDAnalysis, com) as LEDAnalysis; ledMode.HardwareAddress = "01"; ledMode.PlayerModel = "01"; ledMode.StopTime = "00"; ledMode.ColorType = "00"; //数据有效时间 范围0--99 ledMode.EffectiveTime = "00"; ledMode.Speed = speed.ToString(); } /// <summary> /// 发送并保存 /// </summary> /// <param name="msg"></param> /// <returns></returns> public string SendSaveMsg(string msg) { ledMode.Context = msg; if (led.SetSaveLedMessage(ledMode)) { return "发送成功"; } else { return "发送失败"; } } public string SendMsg(string msg) { ledMode.Context = msg; if (led.SetLedMessage(ledMode)) { return "发送成功"; } else { return "发送失败"; } } } }
c#SerialPort接收数据的问题
有时候我只发了一次或者几次后我的串口能一直收到相同的数据,几率还挺大的,读取serialPort.BytesToRead是一直有的,而且是在serialPort.Read完serialPort.BytesToRead清零了之后还是一直能读到的,实际没有发数据的,如果这时候我手动发数据的话这种现象就会停止,但是用串口调试助手也没出现这种情况,请问是为什么怎么解决?谢谢!
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
python 简易微信实现(注册登录+数据库存储+聊天+GUI+文件传输)
socket+tkinter详解+简易微信实现 历经多天的努力,查阅了许多大佬的博客后终于实现了一个简易的微信O(∩_∩)O~~ 简易数据库的实现 使用pands+CSV实现数据库框架搭建 import socket import threading from pandas import * import pymysql import csv # 创建DataFrame对象 # 存储用户数据的表(...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问