各位大侠,你们好,我第一次来CSDN上提问;
我的问题是,我想实现这样一个功能:
有一个串口调试窗口,1)打开这个窗口后(即使什么控件也不按),窗口会自动的以一个预定义好的周期向SerialPort发送数据(这个数据是一定的),并且利用comm_receive来接收数据;
2)在“1)”的过程中,如果有任何一个控件(比如)按钮按下,那么该按钮要求向SerialPort发送一个新的数据(根据事件触发就发送一次,但不同于“1)”定时发送的内容),也利用comm_receive来接收数据;
全过程全部利用RS485(收、发短接)来测试;
请问怎么实现???注:1)其实我已经做了一部分,现在如果不加定时发送的模块,就事件触发然后发送并接收,这是没有问题的;但就是加上定时发送就不会了;
2)针对上述的自动发送功能,我自己瞎搞了一个,见如下主要思想是李彤Timer的Tick事件,不停的发送)
void comm_Receive(object sender, EventArgs e)
{
......
}
void time1_Tick(object sender, EventArgs e)
{
if (comm.IsOpen)
{
while (true)
{
byte[] b = { 0xF8, 0x03, 0x81, 0x0B, 0x00, 0x02, 0x89, 0x9C };
qufen = 0;
comm.Write(b, 0, 8);
Thread.Sleep(100);
}
}
}
但发现根据上述的Timer思想做完后,运行程序,确实能定时发了,但程序是完全死在了定时发送上,不能接收,其他所有控件均不能使用,窗口都关不掉,这是为什么啊???
3)还有最后一个CRC校验的问题:
我是这样写的(思想就是等缓存区有9个字节时,才做读取等事情,否则就等着):
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(5);
int n = comm.BytesToWrite;
for (int i = 0; i <= 20; i++)
{
if (n>=9)
{
byte[] buf = new byte[n];
comm.Read(buf, 0, n);
builder.Length = 0;
this.Invoke((EventHandler)(delegate
{
foreach (byte f in buf)
{
builder.Append(f.ToString("X2") + " ");
}
string zhuangtai = builder.ToString();
}(下面的大括号省略)
利用中断模式运行后发现:字符串zhuangtai始终为null,这到底是为什么?????????
我是C#新手,第一次来这里问问题,希望各位大侠能够帮帮我
CSDN好像不能附件,这不好,不然我就附件源程序了。
我的问题是,我想实现这样一个功能:
有一个串口调试窗口,1)打开这个窗口后(即使什么控件也不按),窗口会自动的以一个预定义好的周期向SerialPort发送数据(这个数据是一定的),并且利用comm_receive来接收数据;
2)在“1)”的过程中,如果有任何一个控件(比如)按钮按下,那么该按钮要求向SerialPort发送一个新的数据(根据事件触发就发送一次,但不同于“1)”定时发送的内容),也利用comm_receive来接收数据;
全过程全部利用RS485(收、发短接)来测试;
请问怎么实现???注:1)其实我已经做了一部分,现在如果不加定时发送的模块,就事件触发然后发送并接收,这是没有问题的;但就是加上定时发送就不会了;
2)针对上述的自动发送功能,我自己瞎搞了一个,见如下主要思想是李彤Timer的Tick事件,不停的发送)
void comm_Receive(object sender, EventArgs e)
{
......
}
void time1_Tick(object sender, EventArgs e)
{
if (comm.IsOpen)
{
while (true)
{
byte[] b = { 0xF8, 0x03, 0x81, 0x0B, 0x00, 0x02, 0x89, 0x9C };
qufen = 0;
comm.Write(b, 0, 8);
Thread.Sleep(100);
}
}
}
但发现根据上述的Timer思想做完后,运行程序,确实能定时发了,但程序是完全死在了定时发送上,不能接收,其他所有控件均不能使用,窗口都关不掉,这是为什么啊???
3)还有最后一个CRC校验的问题:
我是这样写的(思想就是等缓存区有9个字节时,才做读取等事情,否则就等着):
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(5);
int n = comm.BytesToWrite;
for (int i = 0; i <= 20; i++)
{
if (n>=9)
{
byte[] buf = new byte[n];
comm.Read(buf, 0, n);
builder.Length = 0;
this.Invoke((EventHandler)(delegate
{
foreach (byte f in buf)
{
builder.Append(f.ToString("X2") + " ");
}
string zhuangtai = builder.ToString();
}(下面的大括号省略)
利用中断模式运行后发现:字符串zhuangtai始终为null,这到底是为什么?????????
我是C#新手,第一次来这里问问题,希望各位大侠能够帮帮我
CSDN好像不能附件,这不好,不然我就附件源程序了。
1 2 定时发送的问题,估计你的timer1和UI一个线程,所以卡住,建议另开个线程发送
3 一直为null,说明一直没赋值,可能是没读到数据.
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
对于timer循环导致窗口卡主的问题已经解决了,但不知道为什么这样是可以的,原来是不可以的??
现在的代码是:
(其中的HexStringToByteArray()函数已经定义好了,作用是将16进制字符串转为byte数组)
private void timer1_Tick(object sender, EventArgs e)
{
if (comm.IsOpen)
{
string ComString = "123456";
try
{
int len = ComString.Length / 2;
byte[] bytesend = HexStringToByteArray(ComString);
comm.Write(bytesend, 0, bytesend.Length);
}
catch (Exception)
{
}
}
}
为什么这样就行了?我是看别人这么做,我就这么做的,但这是为什么呢? 这样行,原来不行?