【问题标题】:BlueScreen[Error : 0x0000003b / c0000005] Reading bytes from SerialPort蓝屏[错误:0x0000003b / c0000005] 从串口读取字节
【发布时间】:2020-05-06 08:03:11
【问题描述】:

我在这里有一个 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 个字节,所以是的,我的消息字符串那么长,所以它确实有效!只是简单地在它中间崩溃。

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

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

感谢您的帮助

【问题讨论】:

  • 哪一行会抛出这个错误?你有一些奇怪的演员阵容,我猜你选错了。
  • Castin 是正确的,发送方是 SerialPort,所以我只使用正在接收数据的端口并将其用作 SerialPort。我也在读字节,它只是在某个端口蓝屏让我。我不明白,我要求读取字节,在串行端口监视器(ext 程序)中,我看到了我正在读取的整个字符串,但在某个时刻它只会让我的整个电脑崩溃

标签: c# serial-port blue-screen-of-death


【解决方案1】:

您将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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多