这是我的第一个问题,因为在任何地方都找不到答案。
我对WPF和C#并不是特别陌生,但是我以前从未阅读过SerialData,而且我肯定还存在一些基本问题。
设置:
Arduino克隆(SparkFun Pro Micro)发送“ Hello!” +每秒向USB串行端口(COM5)发送一个数字:
String hello = "hello!";
Serial.println(hello + i);
i++;
delay(1000);
并尝试使用简单的按钮在WPF中接收它,该按钮将数据刷新到TextBlock(tbData)。
SerialPort sp = null;
String str = null;
int i = 0;
public MainWindow()
{
InitializeComponent();
sp = new SerialPort("COM5", 9600);
sp.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
sp.Open();
}
void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
str = sp.ReadLine();
}
private void Refresh_Click(object sender, RoutedEventArgs e)
{
tbData.Text = str;
}
但是什么也没发生,我似乎得到了一个空字符串,因为当我按下Refresh_Click按钮时,TextBlock没有显示任何内容。
我可以使它与新线程一起使用,但是它会保持超时,我在这里(Timeouts in C# serial port)读到最好的方法(似乎最简单)是使用SerialDataReceived事件。
t = new Thread(() =>
{
int i = 0;
while (run)
{
SerialString = sp.ReadLine();
Thread.Sleep(1000);
}
sp.Close();
});
我所缺少的一定是某些改变缓冲区大小的方法吗?还是类似的东西?
答案 0 :(得分:0)
似乎我找到了答案!
我对串行通信一无所知,但是今天我遇到了MODE cmd函数:
C:\Users\Username>mode
Status for device COM5:
-----------------------
Baud: 9600
Parity: None
Data Bits: 8
Stop Bits: 1
Timeout: ON
XON/XOFF: OFF
CTS handshaking: OFF
DSR handshaking: OFF
DSR sensitivity: OFF
DTR circuit: OFF
RTS circuit: OFF
我注意到,每当我让Arduino IDE向我报告数据时,它都会改变-它总是会成功完成! -并且每当我尝试使WPF都执行相同操作时。 上面是我尝试运行自己的代码后的MODE返回,并且:
Status for device COM5:
-----------------------
Baud: 9600
Parity: None
Data Bits: 8
Stop Bits: 1
Timeout: OFF
XON/XOFF: OFF
CTS handshaking: OFF
DSR handshaking: OFF
DSR sensitivity: OFF
DTR circuit: ON
RTS circuit: ON
这是在Arduino IDE中打开“工具”>“串行监视器”并立即再次将其关闭后显示的内容。
我从以下位置更改了WPF代码:
sp = new SerialPort("COM5", 9600);
sp.Open();
收件人:
sp = new SerialPort("COM5", 9600);
//sp.ReadTimeout = 200;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Open();
现在,线程示例和SerialDataReceived事件都运行顺利(很好,除非我无法在SerialDataReceived线程中更新UI线程)。
我希望那里的人会觉得有用。