Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从串行端口接收数据时出错_C#_Wpf_Serial Port - Fatal编程技术网

C# 从串行端口接收数据时出错

C# 从串行端口接收数据时出错,c#,wpf,serial-port,C#,Wpf,Serial Port,我的应用程序有几个窗口(实际上是两个几乎相同的窗口,有一些功能)。其中一个功能是从COM端口读取数据(从称重机读取重量)。问题是,它在第一个窗口上工作得很好,但当我关闭它并打开另一个窗口,然后单击同一个函数(我们称之为“计算重量”)时,我收到以下错误消息: 对端口“COM1”的访问被拒绝 代码: private void calculate右键单击(对象发送者,路由目标) { sp=新串行端口(“COM1”,9600,奇偶校验。无,8,停止位。1); tekst=string.Empty; sp

我的应用程序有几个窗口(实际上是两个几乎相同的窗口,有一些功能)。其中一个功能是从COM端口读取数据(从称重机读取重量)。问题是,它在第一个窗口上工作得很好,但当我关闭它并打开另一个窗口,然后单击同一个函数(我们称之为“计算重量”)时,我收到以下错误消息: 对端口“COM1”的访问被拒绝

代码:

private void calculate右键单击(对象发送者,路由目标)
{
sp=新串行端口(“COM1”,9600,奇偶校验。无,8,停止位。1);
tekst=string.Empty;
sp.Open();
sp.WriteLine(((char)5.ToString());
sp.WriteLine(((char)17.ToString());
sp.DataReceived+=新的SerialDataReceivedEventHandler(sp_DataReceived);
}
私有委托无效更新i(字符串s);
无效sp_DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
tekst+=sp.ReadExisting();
如果(钢结构包含('S')和钢结构长度>14)
Dispatcher.Invoke(DispatcherPriority.Send,newupdateui(czytajWage),tekst);
}
string-tekst=string.Empty;
无效czytajWage(字符串s)
{
字符串w=“”;
对于(int i=5;i<14;i++)
{
w+=s[i];
}
MessageBox.Show(w);
w=“”;
tekst=“”;
sp.DataReceived-=sp_DataReceived;
}

有人能帮忙吗?;)

方法
计算右键单击
打开串行端口。因此,我假设您在
Open
call上获得异常,因为状态
UnauthorizedAccessException
可以在以下情况下引发:

当前进程或系统上的另一个进程已由SerialPort实例或非托管代码打开了指定的COM端口


因此,您的解决方案是在完成后关闭和处理sp,或者如果您想重用现有实例,则使用IsOpen。

方法
计算右键单击打开串行端口。因此,我假设您在
Open
call上获得异常,因为状态
UnauthorizedAccessException
可以在以下情况下引发:

当前进程或系统上的另一个进程已由SerialPort实例或非托管代码打开了指定的COM端口


因此,您的解决方案是在完成后
关闭
处置
sp
,或者如果您想重用现有实例,则使用
IsOpen

关闭窗口时是否关闭端口?您不能共享串行端口。当窗口关闭时关闭SerialPort并在另一个窗口中再次打开它也是非常麻烦的。这里的最佳实践是在一个单独的类中派生与SerialPort一起工作的代码,并且只有该类的一个实例。将数据与视图分开。关闭窗口时是否关闭端口?不能共享串行端口。当窗口关闭时关闭SerialPort并在另一个窗口中再次打开它也是非常麻烦的。这里的最佳实践是在一个单独的类中派生与SerialPort一起工作的代码,并且只有该类的一个实例。将数据与视图分开。
   private void calculateWeight_Click(object sender, RoutedEventArgs e)
{
    sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    tekst = string.Empty;
    sp.Open();
    sp.WriteLine(((char)5).ToString());
    sp.WriteLine(((char)17).ToString());
    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}
private delegate void UpdateUi(string s);
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    tekst += sp.ReadExisting();
    if (tekst.Contains('S') && tekst.Length > 14)
        Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUi(czytajWage), tekst);
}
string tekst = string.Empty;

void czytajWage(string s)
{
    string w = "";
    for (int i = 5; i < 14; i++)
    {
        w += s[i];
    }
    MessageBox.Show(w);
    w = "";
    tekst = "";

    sp.DataReceived -= sp_DataReceived;
}