shmilyshushu
shmilyshushu
采纳率66.7%
2019-01-03 20:22 阅读 535

C#,用串口读缓存文件时只读了一小部分,没有读完整。求大佬帮忙。

40

如题,原文件很大,50多万个字符吧。不知道是不是太大影响的
以下是代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace 串口实验2
{
public partial class Form1 : Form
{
string s = "";
string ss = "";
string[] s_1;
int i=0;
SerialPort serialPort1 = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); //初始化串口设置

public delegate void Displaydelegate(byte[] InputBuf);

   // Byte[] OutputBuf = new Byte[128];
    public Displaydelegate disp_delegate;
    public Form1()
    {
        disp_delegate = new Displaydelegate(DispUI);
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
        InitializeComponent();
        this.BackgroundImage = Image.FromFile(@"C:\Users\hasee\Desktop\plane.jpg");
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            if (button1.Text == "打开")
            {
                serialPort1.Open();

                button1.Text = "关闭";
            }
            else
            {
                serialPort1.Close();
                button1.Text = "打开";
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }
    }
    void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        int count = serialPort1.BytesToRead;
        Byte[] InputBuf = new Byte[count];

        try
        {
            serialPort1.Read(InputBuf, 0, serialPort1.BytesToRead);                                //读取缓冲区的数据直到“}”即0x7D为结束符  
            System.Threading.Thread.Sleep(50);
            this.Invoke(disp_delegate, InputBuf);

        }
        catch (TimeoutException ex)         //超时处理  
        {
            MessageBox.Show(ex.ToString());
        }
    }

    public void DispUI(byte[] InputBuf)
    {

        ASCIIEncoding encoding = new ASCIIEncoding();   
        s= encoding.GetString(InputBuf);
        ss = s.Replace(@"\r\nNNNN", "a");
        s_1=ss.Split(new char[] { 'a' });
       // TextBox1.Text = ss;// encoding.GetString(InputBuf);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        //TextBox1.Text = s_1[i];
         TextBox1.Text = s_1.Length.ToString();
         i = i + 1;
    }

    private void button2_Click(object sender, EventArgs e)
    {
          timer1.Enabled = true;
         timer1.Interval = 10;

    }


}

}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • weixin_43221875 幻泪风痕 2019-01-05 18:44

    串口读取文件线程更具设置读取2进制数据,或字符串格式数据。你的程序有点乱也没有注释。
    读取时还需要注意编程欢迎使用的时宽字节还是单字节。
    读取一次可以根据需要设置缓存大小,通常设置512或1024等。
    发送时更具你设置的缓存大小拆分文件或者字符串。一次发一部分。
    接收到再重新拼接起来。
    通常文字或信息可以一次传输完成。
    如你时指文字信息接收只有一半的话应该是你是用的环境是 Unicode 字符集。

    //接收数据线程
    UINT ThreadRecv(LPVOID lparam)
    {
        C串口通信助手Dlg* pWnd = (C串口通信助手Dlg*)lparam;
    
        VARIANT variant;                //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。
        COleSafeArray safearray;
        LONG len = 0, k = 0;
        BYTE rxdata[2048] = { 0 };        //字节数组,用来接收数据
        CString s;
        static int iRecvBytes = 0;
        if (pWnd->m_cmsCom.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符     
        {
            //可以根据自己定义的通信协议,修改代码
            variant = pWnd->m_cmsCom.get_Input();                   //读缓冲区  
            safearray = variant;                            //VARIANT型变量转换为ColeSafeArray型变量
            len = safearray.GetOneDimSize();                //得到有效数据长度        
            for (k = 0;k < len;k++)
                safearray.GetElement(&k, rxdata + k);       //转换为BYTE型数组         
            for (k = 0;k < len;k++)                         //将数组转换为Cstring型变量    
            {
                BYTE bt = *(char*)(rxdata + k); //字符型      
                s.Format(_T("%c"), bt);
                pWnd->m_recvEdit += s;              //显示到接收窗口中
                ++iRecvBytes;
                pWnd->m_iRecvBytes = iRecvBytes;
            }
        }
    
        pWnd->SetDlgItemText(IDC_EDIT_RECV, pWnd->m_recvEdit);
    
        return 0;
    }
    
    点赞 评论 复制链接分享

相关推荐