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

如题,原文件很大,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;

    }


}

}

shmilyshushu
shmilyshushu 我又在网上看了看,应该是串口要多次读取缓存才能读完整,但是小弟不会啊,有没有大神帮帮忙有偿也可以。
一年多之前 回复

1个回答

串口读取文件线程更具设置读取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;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问