【发布时间】:2015-10-12 10:36:18
【问题描述】:
我对 c# 很陌生,我正在为我设计的板创建一个串行端口类。其中此类包含打开/关闭连接到板的串行端口的方法。它还应该从板读取消息并将消息从 UI 写入板(我正在使用表单应用程序来输入和显示值)。
我读取内部输入缓冲区并将字节放入我自己的软件缓冲区中,当消息完成时,这将提示表单分析消息...
为此,我创建了一个索引器来指向数组(来自表单)并获取它想要的字节。
uint[] serialPortReceiveBuffer = new uint[3];
public delegate void Del();
Del promptFormAction = Form1.MsgReceived;
public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
for (int i = 0; i <= 2; i++)
{
serialPortReceiveBuffer[i] = (uint)serialPort1.ReadByte();
}
promptFormAction();
}
public uint this[uint i]
{
get { return serialPortReceiveBuffer[i]; }
}
这是我的pcbSerialPort类中的代码,Form1类中与之相关的代码如下:
public static void MsgReceived()
{
Form1 _frm = new Form1();
_frm.analyzeIncomingMessage();
}
public void analyzeIncomingMessage()
{
if (PCB[0] == 63)
{
setBoardDesignator(PCB[1], PCB[2]);
}
}
我的问题是,当我使用索引器访问serialPortReceiveBuffer 时,它看不到我在将接收到的字节放入同一个数组时对其所做的更改。例如,当我收到我自己的协议字符串时 --> "?10" 缓冲区被 [63][49][48]
虽然当我尝试使用索引器访问此缓冲区时,我得到 [0][0][0]
请问有人可以帮忙吗?此外,我知道可能还有其他一些事情我可以做得更好,所以如果你有任何一般性的提示会很棒。也是一种我可以理解的语言。我只是了解 c# 的许多方面,过去一年我一直在做嵌入式软件,但我不认为自己是一个称职的程序员。
谢谢
【问题讨论】:
-
PCB在哪里定义?你确定你在看同一个实例吗?你确定DataRecieved事件甚至被触发了吗? IIRC,在触发该事件之前必须满足一个阈值(字节数)。 -
您好,感谢您的回复,是的,DataReceived 事件肯定是在调试模式下触发的,我可以看到我的 PCB 已成功发送消息“?10”,并且正确的值已存储在大批。我在 promptFormAction() 旁边放了一个标记;所以我会以完整的形式看到数组。然后在索引器中也放一个标记并按下播放键,只看到数组是空的。
-
PCB 在顶部的 Form1 类中定义,如下所示:pcbSerialPort PCB = new pcbSerialPort();
-
@JonathanBrown 你有它。通过在
MsgReceived方法中创建一个新实例,您可以使用字节数组的一个普通的新实例。您应该像我的回答一样研究如何正确使用事件,这将使您摆脱这个问题。 -
@ThorstenDittmar 答案很好,您应该阅读它。至少,如果您不想接受 Thorsten 的建议并重新设计它,则需要将收到消息的
pcbSerialPort的实例传递给您的静态MsgReceieved函数,然后将其传递给 @987654329 的构造函数@ 所以它可以存储引用而不是创建一个新的(和单独的)引用。
标签: c# arrays properties indexer