大家好,
首先让我说我是 C# 新手,因为我更喜欢嵌入式 C。
我正在尝试使用 MSP430FR5739(TI 微控制器)从信号发生器读取 2Hz 信号。我使用板载 ADC 以 1MHz 周期以 1024 个样本对模拟值进行采样,并使用 USB 转串口以 9600 波特率通过 UART 通信发送。我让这一切工作得非常完美......(因为我已经通过超级终端和arduino的串行监视器对此进行了测试)
发送的数据,如下所示:(每个都换行)
0
0
0
16
51
123
157
227
250
315
338
384
404……
如您所见,每个数据都显示在一个新行上......但这是我的问题。
目前,我正在使用此 C# 代码在显示数据的应用程序中读取和解析数据,如下所示:
[接收数据][1]
这是UI应用程序的问题:
当 2Hz 信号发生变化时(例如从正弦波变为方波,或峰峰值发生变化),我的应用程序中的数据需要永远发生变化。如果我通过超级终端或 arduino 的串行监视器读取信号数据,一旦信号值发生变化,数据也会发生变化……但不在此应用程序中。我认为,我正在正确读取串行端口,但我认为有某种缓冲区已填满,然后该缓冲区需要永远到达信号更改的点,然后显示它。我真的需要了解发生了什么......我试图在互联网上找到可能的解决方案以寻求解决方案,但我没有找到任何有意义的解决方案。
为什么我不能像串行控制台那样实时读取它?
/***function for listening incoming data on the serial COM port***/
private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (serialPort.ReadBufferSize != 0)
{
ReceivedData = ComPort.ReadLine(); //read each data line whenever the buffer size is not zero
this.Invoke(new EventHandler(DisplayData)); //call another thread to write data on rtxtDisplay
}
}
catch(TimeoutException)
{
MessageBox.Show(this, "Buffer error!", "TIMEOUT EXCEPTION", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
/***function to display the received***/
private void DisplayData(object sender, EventArgs e)
{
try
{
if (ckBoxAutoscroll.Checked == true)
{
rtxtDataRx.AppendText(ReceivedData); //display each data received
rtxtDataRx.SelectionStart = rtxtDataRx.Text.Length - 1;
rtxtDataRx.ScrollToCaret(); //auto scroll the rich textbox with incoming data
}
else
{
rtxtDataRx.AppendText(ReceivedData); //display each data received
rtxtDataRx.SelectionStart = rtxtDataRx.Text.Length - 1;
}
//for testing the signal generator
val1 = Convert.ToDouble(ReceivedData);
val1 = (val1 * 0.00352);
num1 = Math.Round(val1, 2);
voltage = Convert.ToString(num1);
}
catch (Exception)
{
//catch any bug and display this message
MessageBox.Show(this, "Transmission jammed!", "UART COMs ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}