c# 运用serialport与PLC串口通讯,读取(例如D200)的数据 80C

网上下的 c# 运用serialport与PLC串口通讯程序,小白看不太懂下的程序,求大神帮忙分析下,主要想知道程序中的tebox1、textbox4、textbox5、textbox6、textbox7分别对应图中哪个空,对应的空应填写什么,例如想读取三菱F3X系列PLC D200的数据,初始地址填200?那设备地址和长度填啥?
界面如下:图片说明

主要程序如下:

    private void btn_open_Click(object sender, EventArgs e)
    {
        int nSelect;
        btn_open.Enabled = false;
        Object selectedItem = cbxCOMPort.SelectedItem;
        sp.PortName = selectedItem.ToString();//串口
        selectedItem = cbxBaudRate.SelectedItem;
        sp.BaudRate = int.Parse(selectedItem.ToString());//波特率
        nSelect = cbxDataBits.SelectedIndex;//数据位
        switch (nSelect)
        {
            case 0:
                sp.DataBits = 8;
                break;
            case 1:
                sp.DataBits = 7;
                break;
            case 2:
                sp.DataBits = 6;
                break;
            case 3:
                sp.DataBits = 5;
                break;
        }
        nSelect = cbxParity.SelectedIndex;
        switch (nSelect)
        {
            case 0:
                sp.Parity = Parity.None;
                break;
            case 1:
                sp.Parity = Parity.Odd;
                break;
            case 2:
                sp.Parity = Parity.Even;
                break;
            case 3:
                sp.Parity = Parity.Mark;
                break;
            case 4:
                sp.Parity = Parity.Space;
                break;
        }
        nSelect = cbxStopBits.SelectedIndex;
        switch (nSelect)
        {
            case 0:
                sp.StopBits = StopBits.None;
                break;
            case 1:
                sp.StopBits = StopBits.One;
                break;
            case 2:
                sp.StopBits = StopBits.OnePointFive;
                break;
            case 3:
                sp.StopBits = StopBits.Two;
                break;
        }
        sp.Open();
        btn_close.Enabled = true;
    }

    private void btn_send_Click(object sender, EventArgs e)
    {
        textBox1.Text = "";
        int n = 6;
        byte[] buf = new byte[n];
        string ee = textBox4.Text;
        buf[0] = Convert.ToByte(ee);
        if (comboBox1.Text == "3X")
        {
            buf[1] = Convert.ToByte(3);
        }
        else
        {
            buf[1] = Convert.ToByte(4);
        }
        if (int.Parse(textBox5.Text) <= 255)
        {
            buf[2] = Convert.ToByte(0);
            buf[3] = Convert.ToByte(int.Parse(textBox5.Text));
        }
        else
        {
            if (Convert.ToString(int.Parse(textBox5.Text), 16).Length < 4)
            {
                int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 1), 16);
                buf[2] = Convert.ToByte(b);
                int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(1, 2), 16);
                buf[3] = Convert.ToByte(c);
            }
            else
            {
                int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 2), 16);
                buf[2] = Convert.ToByte(b);
                int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(2, 2), 16);
                buf[3] = Convert.ToByte(c);
            }
        }


        if (int.Parse(textBox6.Text) <= 255)
        {
            buf[4] = Convert.ToByte(0);
            buf[5] = Convert.ToByte(int.Parse(textBox6.Text));
        }
        else
        {
            if (Convert.ToString(int.Parse(textBox6.Text), 16).Length < 4)
            {
                int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 1), 16);
                buf[4] = Convert.ToByte(d);
                int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(1, 2), 16);
                buf[5] = Convert.ToByte(f);
            }
            else
            {
                int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 2), 16);
                buf[4] = Convert.ToByte(d);
                int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(2, 2), 16);
                buf[5] = Convert.ToByte(f);
            }
        }
        p = int.Parse(textBox6.Text) * 2 + 5;
        byte[] buf1 = new byte[n + 2];
        byte[] ReturnData = new byte[2];
        ReturnData = CRC16_C(buf);
        for (int i = 0; i < n; i++)
        {
            buf1[i] = buf[i];
        }
        buf1[n] = ReturnData[1];
        buf1[n + 1] = ReturnData[0];
        sp.Write(buf1.ToArray(), 0, n + 2);
    }
    void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        int n = sp.BytesToRead;
        byte[] TxData = new byte[n];//声明一个临时数组存储当前来的串口数据
        sp.Read(TxData, 0, n); //读取缓冲数据 
        m = m + n;
        this.Invoke((EventHandler)
           (delegate
                {

                    Array.Resize(ref  TxData2, m);//改写数组大小
                    TxData.CopyTo(TxData2, m - TxData.Length);
                    if (m == p)
                    {
                        byte[] data = new byte[p - 2];
                        for (int i = 0; i < TxData2.Length - 2; i++)
                        {
                            data[i] = TxData2[i];
                        }
                        byte[] data2 = new byte[2];
                        data2[0] = TxData2[TxData2.Length - 2];
                        data2[1] = TxData2[TxData2.Length - 1];
                        byte[] data1 = new byte[2];
                        data1 = CRC16_C(data);
                        if (data1[0] == data2[1] && data1[1] == data2[0])
                        {
                            for (int j = 3; j <= m - 4; j = j + 2)
                            {
                                string s1 = TxData2[j].ToString();
                                string s2 = TxData2[j + 1].ToString();
                                string s = s1 + s2;
                                int g = Convert.ToInt32(s, 10);
                                string h = g.ToString();
                                textBox1.Text += h + "  ";
                            }
                            textBox7.Text = "读取成功";
                        }
                        else
                        {
                            textBox7.Text = "读取失败";
                        }
                        m = 0;
                    }

                }
           )
        );
    }
    public byte[] CRC16_C(byte[] data)
    {
        byte CRC16Lo;
        byte CRC16Hi;
        byte CL; byte CH;
        byte SaveHi; byte SaveLo;
        byte[] tmpData;
        int Flag;
        CRC16Lo = 0xFF;
        CRC16Hi = 0xFF;
        CL = 0x01;
        CH = 0xA0;
        tmpData = data;
        for (int i = 0; i < tmpData.Length; i++)
        {
            CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]);
            for (Flag = 0; Flag <= 7; Flag++)
            {
                SaveHi = CRC16Hi;
                SaveLo = CRC16Lo;
                CRC16Hi = (byte)(CRC16Hi >> 1);
                CRC16Lo = (byte)(CRC16Lo >> 1);
                if ((SaveHi & 0x01) == 0x01)
                {
                    CRC16Lo = (byte)(CRC16Lo | 0x80);
                }

                if ((SaveLo & 0x01) == 0x01)
                {
                    CRC16Hi = (byte)(CRC16Hi ^ CH);
                    CRC16Lo = (byte)(CRC16Lo ^ CL);
                }
            }
        }
        byte[] ReturnData = new byte[2];
        ReturnData[0] = CRC16Hi;
        ReturnData[1] = CRC16Lo;
        return ReturnData;

4个回答

点击你想要查看的控件,串口后面的combobox,你右键属性,然后就可以查看对应控件的name名称了。

qq_42027587
qq_42027587 回复qq_23126581: 所以能不能帮忙看看我这个下的程序对应的应该填什么,十分感谢
一年多之前 回复
qq_23126581
渊渟无迹静涛君 这个都有指定的命令的,不是说网上找的有用,
一年多之前 回复
qq_42027587
qq_42027587 这我知道啊,界面是我自己搞的,就是不知道对应的对不对,而且我设备地址,初始地址,长度应该填什么啊,我发送了一直没反应,想知道发送的对不对,比如读取D200,我初始地址填200?那设备地址和长度填啥
一年多之前 回复

图片说明 你点击那个控件然后看属性 最上面那行就是控件名,你把串口信息
写好点击打开就会监听串口,发送的数据一般是用16进制的字符串

qq_42027587
qq_42027587 这我知道啊,界面是我自己搞的,不知道对应的对不对,而且我设备地址,初始地址,长度应该填什么啊,发送了一直没反应
一年多之前 回复

选择控件界面右键属性就可以看见name属性了。就知道对应的是那个了

plc 都是 modbus协议 起始地址 00 00 长度 自定 去扫吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#串口SerialPort总是收到数据
有时候我只发了一次或者几次后我的串口能一直收到相同的数据,几率还挺大的,读取serialPort.BytesToRead是一直有的,而且是在serialPort.Read完serialPort.BytesToRead清零了之后还是一直能读到的,实际没有发数据的,如果这时候我手动发数据的话这种现象就会停止,但是用串口调试助手也没出现这种情况,请问是为什么怎么解决?谢谢!
c#SerialPort接收数据的问题
有时候我只发了一次或者几次后我的串口能一直收到相同的数据,几率还挺大的,读取serialPort.BytesToRead是一直有的,而且是在serialPort.Read完serialPort.BytesToRead清零了之后还是一直能读到的,实际没有发数据的,如果这时候我手动发数据的话这种现象就会停止,但是用串口调试助手也没出现这种情况,请问是为什么怎么解决?谢谢!
c#SerialPort的数据处理问题
我想对读取串口发来的数据做处理,分别是单次发送来和两次(多次)短时间内发来的数据做不同的处理,怎么实现?谢谢!
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 连续发送3次,如果直接发送3次的话 会出现问题接收不完全或其他错误。
c#中serialPort 每发送一次接收一个返回值,要连续发送3次,如果直接发送3次的话 会出现和接收的冲突,如何解决这种冲突 让他能顺利的收发完成,分成3步操作的话是可以的已经测试了。 发送方式 第一次发送A1 下位机返回 B1 第二次发送A2 下位机返回 6个数据 第三次发A3 下位机返回25个数据 如何让这三次发送不冲突,能顺利完成 ,求大神解答。
c#用serialport进行的串口数据接收,遇到了问题,求大神指点
运行后再richtextbox1中只显示一个数,例如:33 随后会报错:对象未引用到对象的实例,点了关闭后又会出现一个数据,例如31,之后又会报错,如此循环,而且数据不太对。 整了好久了,希望能帮帮忙,第一次做这,谢谢!! 代码: namespace yfy_串口调试 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /****************************设置变量******************************/ public string[] strArray; public SerialPort sp1 = new SerialPort(); public Byte[] mydata; public int mydatalength; //这个数的值是由接收到的字节长度决定的,并且作为mydata的长度,如果索引值还超过数组定义值,就应该是接收问题。 public int zhengfu = 2, now_x = 30; public static Bitmap bmp = new Bitmap(500,350); public Graphics gph = Graphics.FromImage(bmp); public char name_image='A'; /*****************************相关函数****************************/ public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收函数 { if (sp1.IsOpen==true ) //为了严谨性,加上检查串口是否被打开 { if (rbRcv16.Checked == true) //接收16进制按钮 { try { int average_speed = 0; //设置初始平均速度 Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组 sp1.Read(receivedData, 0, receivedData.Length); //读取数据 sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer mydatalength = receivedData.Length; for (int i = 0; i < receivedData.Length; i++) //窗体显示 { richTextBox1.Text = receivedData[i].ToString("X2"); //16进制显示在接受栏 mydata[i] = receivedData[i]; richTextBox1.Text += ","; //让每个数据都隔开 average_speed += receivedData[i]; } textBox1.Text = (average_speed / receivedData.Length).ToString("X2"); } catch (System.Exception ex) { MessageBox.Show(ex.Message, "出错提示"); } } } else { MessageBox.Show("请打开某个串口或者没有选中16进制接收", "错误提示"); } } private void Form1_Load(object sender, EventArgs e)//页面初始化 { Control.CheckForIllegalCrossThreadCalls = false; //强制不检查线程 sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //订阅委托 sp1.ReceivedBytesThreshold =1; //当缓冲区的字节数为x时,触发datareceive事件 //检查是否有串口 string[] str = SerialPort.GetPortNames(); if (str == null) { MessageBox.Show("本机没有串口!", "Error!"); return; } //添加串口项目 foreach (string s in System.IO.Ports.SerialPort.GetPortNames()) { cbSerial.Items.Add(s); //获取有COM口 } rbRcv16.Checked = true; //接收数据按16进制进行 } private void btnSwitch_Click(object sender, EventArgs e)//设置串口 { if (sp1.IsOpen == false) { try { string serialName = cbSerial.SelectedItem.ToString();//读取串口号 sp1.PortName = serialName; //设置串口号 sp1.BaudRate = 9600; //波特率 sp1.DataBits = 8; //数据位 sp1.StopBits = StopBits.One; //停止位 sp1.Parity = Parity.None; //校验位 sp1.Open(); //打开串口 btnSwitch.Text = "关闭串口"; } catch (System.Exception ex) { MessageBox.Show("Error:" + ex.Message, "Error"); return; } } else { sp1.Close(); //关闭串口 btnSwitch.Text = "打开串口"; } }
用C#SerialPort控件写的四轴飞行器地面站串口部分出了些问题,希望高人指点!
做了一个四轴飞行器地面站,C#写的,用MPU9150来读取姿态,通过串口来向电脑上传输,解决大小BUG后完美运行,后来STM32开发板上的串口坏了,只能改用无限数传来向地面站传输数据,这时程序读的数据全都是跳跃的,有延时的,屏幕显示的那个四轴模型的动作也是一卡一卡的,完全没法用啊,用网上现有的串口程序结合无限数传试了一下,没有传输数据的卡顿啊,到底为什么呢?是C#的SerialPort和无限数传之间的问题吗?该怎么解决啊!这里先谢谢了!
C# serialPort 串口连接modem通信 64位系统不能通信
C# serialPort 串口连接modem通信,在32位系统是能正常通信,当发布 64位系统不能通信了?请大牛啊!!
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#serialPort串口控件使用后资源释放问题
在使用C#serialPort制作的串口调试器过程中发现的问题,希望能够描述清楚也希望有人能知道为什么会这样, 假设使用C#串口调试助手打开COM1之后再关闭com1之后直接使用com1口为单片机写程序,这样问题就来了, 只是能够正常打开串口但是却永远显示等待单片机响应,只有拔掉USB串口再重插或者使用网上下载的串口调试助手重新打开一次COM1在关闭才可以给单片机写入程序,不知道是什么问题,补充说明下如果不给单片机写程序的话只是使用串口测试收发那一切都正常,无论怎么打开关闭再打开都可以收发数据, 个人水平有限不知道为什么只是感觉上是C#serialPort控件打开再关闭之后没有彻底释放资源还有占用,我能想到的关闭方法只有下面这些了 试过关闭代码如下: serialPort1n.Close(); serialPort1n.Dispose(); GC.Collect(); GC.WaitForPendingFinalizers(); 只是仍然是有问题,实际试了从网上下载的串口调试助手就没有我说的这个问题,下面是我打开串口的代码了: serialPort1n.Open();//打开串口 if (serialPort1n.IsOpen) { }
SerialPort串口通讯收到多余的数据
我有一C#编写的上位机软件与下位机通讯,下位机是C语言的程序,上位机的串口接收类是SerialPort,偶尔会有问题是会收到一些下位机程序中没有的数据,如00E4C8EBB5C4D0D4B1F03D300D0ACAE4C8EBB5C4D1AABAECB5B0B0D,请问这是什么原因?硬件中如串口或数据线或单片机会导致这样吗?还是说serialport这个类本身就不完善。
C#serialPort实现串口通信
我想实现的是上位机发送数据,然后接收数据,然后上位机处理数据,再继续发送数据一直循环到结束。 目前的问题就是,我通过以下代码实现的是在循环调用测试函数,循环运行完了以后,才开始读取数据 ``` public Form1() { InitializeComponent(); serialPort1.DataReceived += serialPort1_DataReceived; } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(Read)); } private void Read(object s, EventArgs e) { int n = serialPort1.BytesToRead; byte[] buf = new byte[n]; serialPort1.Read(buf, 0, n); data_catched=true; } public bool test_CA() {//测试CA //定义附加信息 Byte[] test_CA_add = new Byte[1] { 0x00 }; //发送命令帧 Write(test_cmd_CA, test_CA_add);//发送数据函数测试无误,并在发送完后立刻有数据返回 byte test_CA_data; //时延等待接收数据 for (int i = 0; !data_catched && i < 300; i++) { Thread.Sleep(10); } if (!data_catched) { //处理数据 } data_catched=false; } ```
C#中的serialport.Write与MSCOMM控件的put_output有什么区别?
我使用C#上位机中的serialport.write发送数据 下位机收到的与上位机发送的数据不一样, 使用MSCOMM控件发送则没有问题, 求问有什么区别 (T^T)
C#与西门子200通讯,读取超过3个字节,界面就死机,求教
使用C#编写了一个与PLC通讯的串口通讯程序,可以通讯和读取数据,但是不能超过3个字节,不知道什么原因,求教。 if (bz == 1) { byte[] dataa = { 0x68, 0x1B, 0x1B, 0x68, 0x02, 0x00, 0x6C, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x01, 0x12, 0x0A, 0x10, 0x02, 0x00, 0x03, 0x00, 0x01, 0x84, 0x00, 0x03, 0x20, 0x8D, 0x0016 };//发送指定的16进制字节数组 serialPort1.Write(dataa, 0, dataa.Length); } 把0x03改成0x04就不行了。
C#多个窗口使用用一个串口接受数据问题
我在主窗口MainForm中设置了Static SerialPort,在主界面注册了一个监听事件,然后在调到子界 之前,我注销了监听事件, serialPort.DataReceived -= new SerialDataReceivedEventHandler(serial_DataReceived); ``` 然后在子界面Calibration中使用了SerialPort,然后重新设置了监听事件: MainForm.serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived2); ``` 想实现的方式是:在子窗口关闭之前将监听事件取消,然后在主界面在重新设置监听事件,关闭子窗口后主界面实现的代码 calibrationForm = new Calibration( ); calibrationForm.ShowDialog(); if (calibrationForm.DialogResult == System.Windows.Forms.DialogResult.OK) { serialPort.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived); } 但是现在的结果是回到主界面后返回的数据仍然在子窗口事件监听器中显示(通过Console打印返回的数据大小) ``` 求大神指点!!! ```
【求助】c#SerialPort与Delphi的TApdComPort机制问题
使用serialport控件发送字符串命令无响应 而使用delphi中TApdComPort控件发送却可以 求大神指教,这两个串口发送机制有什么区别之处吗
C#串口数据读取问题求助
用C#中的一个serialport类读取cc2431传感器通过usb(com口)传来的数据,程序代码如下 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增加接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString()); //修改接收计数 labelGetCount.Text = "Get:" + received_count.ToString(); })); } 会读取到如下数据71 09 FC 08 00 F1,而实际上用配套的串口调试助手得到的一串数据时这样的:04 C0 E0 D8 27 3B 03 23 4D 80 03 B0 02 00 4C 00 40 7F C0 4C 32 32 00 42 24 FF 不知道程序哪里应该改动,才能得到同串口调试助手一样的数据
C# SerialPort的Datareceive事件触发后,BytesToRead的值有时候为零
下位机每隔0.5秒通过串口传25个字节到上位机,串口接收到数据后处理并用zedgraph控件绘制实时曲线图,程序运行几分钟后,Datareceive事件触发后,BytesToRead的值有时候为0,有时是25,也有时是50,界面刷新有时也不是0.5秒。 接收程序: ``` private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { if (mySerialPort.IsOpen) { Thread.Sleep(10); int count = mySerialPort.BytesToRead; byte[] data = new byte[count]; mySerialPort.Read(data, 0, count); if (data[0] == 0x01 && data[1] == 0x03) { this.Invoke(textChanged, data, count); } } } catch (Exception err) { throw err; } } ``` 处理程序: ``` textChanged += new UpdateTextEventHandler(ChangeText); private delegate void UpdateTextEventHandler(byte[] buffer,int m);//定义委托 private event UpdateTextEventHandler textChanged;//定义事件 private void ChangeText(byte[] buffer,int m) //事件处理方法 { s1 = ""; Array.Copy(buffer, 3, float_byte1, 0, 4); Array.Copy(buffer, 8, float_byte2, 0, 4); Array.Copy(buffer, 13, float_byte3, 0, 4); Array.Copy(buffer, 18, float_byte4, 0, 4); temperture[0] = BitConverter.ToSingle(float_byte1, 0); temperture[1] = BitConverter.ToSingle(float_byte2, 0); temperture[2] = BitConverter.ToSingle(float_byte3, 0); temperture[3] = BitConverter.ToSingle(float_byte4, 0); textBox1.Text = temperture[0].ToString(); textBox2.Text = temperture[1].ToString(); textBox3.Text = temperture[2].ToString(); textBox4.Text = temperture[3].ToString(); for (int i = 0; i < m; i++) { s1 += buffer[i].ToString("X2"); s1 += " "; } textBox5.Text = s1.ToString(); if (Curve_Flag == 1) { i++; creatGraph(temperture[j]); } } ``` zedgraph绘图: ``` public void creatGraph(float temp) { double x = (double)i; double y = Convert.ToDouble(temp); list.Add(x, y); myCurve = zedGraphControl1.GraphPane.AddCurve("", list, Color.Red, SymbolType.None); //myCurve.Symbol.Fill = new Fill(Color.Blue);//填充数据点 zedGraphControl1.AxisChange();//画到zedGraphControl1控件中,此句必加 zedGraphControl1.Refresh();//重新刷新 } ```
windows10系统中c#调用system.io.port SerialPort类不能通讯
在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); 请各位大侠,帮助解决! 多谢!
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
前后端分离后,维护接口文档基本上是必不可少的工作。 一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了。当然这是一种非常理想的状态,实际开发中却很少遇到这样的情况,接口总是在不断的变化之中,有变化就要去维护,做过的小伙伴都知道这件事有多么头大!还好,有一些工具可以减轻我们的工作量,Swagger2 就是其中之一,至于其他类似功能但是却收费的软...
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
天天学JAVA-JAVA基础(6)
如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍JAVA 中最常使用字符串常量String相关知识。 1.String简介 2.创建字符串对象两种方式的区别 3.String常用的方法 4.String的不可变性 5.一道阿里面试题,你会做吗? 1.String简介 1.1String源码 首先看一段String源码,String主要实现了Serializable、Compar...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
2020 网络课 智慧树自动刷课代码,自动跳转,自动答题并关闭弹窗,自动1.5倍速静音
刷课一时爽,一直刷课一直爽! 终于让我找到了这个黑客代码了,教程开始: 只限谷歌浏览器和火狐浏览器使用,如果第一次失败,请重新试一下次 将下面代码复制后,进入浏览器按F12键,先点击console 然后Ctrl+v复制代码 最后按回车键即可 var ti = $("body"); var video = $(".catalogue_ul1 li[id*=video-]"); var i = 1;...
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
羞,Java 字符串拼接竟然有这么多姿势
二哥,我今年大二,看你分享的《阿里巴巴 Java 开发手册》上有一段内容说:“循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作符。”到底为什么啊,我平常一直就用的‘+’号操作符啊!二哥有空的时候能否写一篇文章分析一下呢? 就在昨天,一位叫小菜的读者微信我说了上面这段话。 我当时看到这条微信的第一感觉是:小菜你也太菜了吧,这都不知道为啥啊!我估...
写1行代码影响1000000000人,这是个什么项目?
不带钱不带卡,只带手机出门就能畅行无阻,这已是生活的常态。益普索发布的《2019第一季度第三方移动支付用户研究》报告显示,移动支付在手机网民中的渗透率高达95.1%,截至今年1月,支付宝全球用户数已经突破10亿。你或许每天都会打开支付宝,付款购物、领取权益、享受服务……但你或许不知道的是,在这个方便、快捷、智能化的APP背后,有一群年轻的技术人,用智慧和创新让它每天都变得更“聪明”一点。 ...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
一点一滴记录 Java 8 stream 的使用
日常用到,一点一滴记录,不断丰富,知识积累,塑造自身价值。欢迎收藏 String 转 List String str = 1,2,3,4; List&lt;Long&gt; lists = Arrays.stream(str.split(",")).map(s -&gt; Long.parseLong(s.trim())).collect(Collectors.toList()); Lis...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问