首页 > 解决方案 > BlueScreen [Error : 0x0000003b / c0000005] 从 SerialPort 读取字节

问题描述

我在这里有一个 BarcodeScanner,我告诉它为我拍照。我将命令作为字节发送到扫描仪,等待响应,然后我尝试读取它。

如果我只是使用串行监视器并手动发送字节它工作得很好,我得到我的整个 jpeg 并且我很高兴。

如果我在 C# 中尝试它,我尝试用一​​种简单的方法读取字节(是我在谷歌上找到的面包和黄油方法。我使用的是正常的(serialport.ReadExisting() 以相同的方式崩溃)。

这是整个事件:

 public void serial_datareceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                usescanner = (SerialPort)sender;
                if (sender is SerialPort)
                {
                    string port = ((SerialPort)sender).PortName;
                    int count = ((SerialPort)sender).BytesToRead;
                    int returnAscii = 0;
                    string message = "";
                    while (count > 0)
                    {
                        returnAscii = ((SerialPort)sender).ReadByte();
                        message = message + Convert.ToChar(returnAscii);
                        count--;
                    }
                    ScanPort sport = new ScanPort(port, true);
                    scanner.ScannerPort = sport;
                }

            ((SerialPort)sender).Close();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

总是得到 4096 个字节来读回。然后我可以读到大约 70-90 个字节,所以是的,我的消息字符串那么长,所以它确实有效!只是简单地在它中间崩溃。

扫描仪不是问题,因为我长时间使用扫描仪。我可以来回发送数据。我还在制造商交给我的演示程序上对其进行了测试,因此它确实有效。

有任何想法吗?也许我只是不知道如何读取字节。

谢谢您的帮助

标签: c#serial-portblue-screen-of-death

解决方案


您设置usescanner为您的 SerialPort 但随后您继续在((SerialPort)sender)整个代码中调用并且不引用usescanner. 设置它的意义何在?

任何人,你应该设置一个非常简单的例子,看看你是否可以让错误发生。有时,当您添加太多复杂的代码时,很难找到问题所在。我建议简单地证明这是问题所在,而不是您的代码。创建一个带有打开按钮和关闭按钮的新表单。

public partial class Form2 : Form
{
    SerialPort sp;

    public Form2()
    {
        InitializeComponent();
    }

    private void buttonOpen_Click(object sender, EventArgs e)
    {
        sp = new SerialPort("COM1", 9600);  //initialize our serial port
        sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); //create our data received event
        sp.Open(); //Open the port
    }

    void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string Data = sp.ReadExisting();

        Console.Write(Data);
    }

    private void buttonClose_Click(object sender, EventArgs e)
    {
        sp.Close(); //close the port
    }
}

推荐阅读