先抱怨一下, 刚写了半天,点击发帖,竟然说我只有给100分的权限, 写了半天的东西, 没了。重来吧初次接触 C#串口通讯和委托,线程问题一委托 delegate void delegatetype(ProgressBar prb); private void button1_Click(object sender, EventArgs e)
{
delegatetype mydele = new delegatetype(DoThings);
Thread th1 = new Thread(new ParameterizedThreadStart(mydele));
th1.Start(progressBar1);
} void DoThings(ProgressBar prb)
{
for (int i = prb.Minimum; i < prb.Maximum; i++)
{
prb.Value = i;
}
}
如, 上面, 在delegate void delegatetype(ProgressBar prb);是带参数的, 而且Dothings方法也是带参数的
那么 ,像button1事件里的线程那块儿, 我该如何放置这个参数,也就是ProgressBar上面贴的代码,编译不能通过问题二C#Serialport的DataReceived事件触发问题这个更模糊了, 在网上依照例子实现了发送, 我用的虚拟串口, COM2,COM3, com2发送, com3接收目前只能发送, 接收不到奥,好像并没有触发DataReceived事件。另外, 像我这个例子, 是不是在form里放2个Serialport?
写了这么多, 真心希望高人指教 邮箱 [email protected]
{
delegatetype mydele = new delegatetype(DoThings);
Thread th1 = new Thread(new ParameterizedThreadStart(mydele));
th1.Start(progressBar1);
} void DoThings(ProgressBar prb)
{
for (int i = prb.Minimum; i < prb.Maximum; i++)
{
prb.Value = i;
}
}
如, 上面, 在delegate void delegatetype(ProgressBar prb);是带参数的, 而且Dothings方法也是带参数的
那么 ,像button1事件里的线程那块儿, 我该如何放置这个参数,也就是ProgressBar上面贴的代码,编译不能通过问题二C#Serialport的DataReceived事件触发问题这个更模糊了, 在网上依照例子实现了发送, 我用的虚拟串口, COM2,COM3, com2发送, com3接收目前只能发送, 接收不到奥,好像并没有触发DataReceived事件。另外, 像我这个例子, 是不是在form里放2个Serialport?
写了这么多, 真心希望高人指教 邮箱 [email protected]
SerialPort spReceive; //spReceive接受数据
TextBox txtSend; //发送区
TextBox txtReceive; //接受区
Button btnSend; //数据发送按钮
delegate void HandleInterfaceUpdateDelegate(string text); //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;public void InitClient() //窗体控件已在初始化
{
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象
spSend.Open(); //SerialPort对象在程序结束前必须关闭,在此说明
spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);
spReceive.ReceivedBytesThreshold = 1;
spReceive.Open();
}public void btnSend_Click(object sender,EventArgs e)
{
spSend.WriteLine(txtSend.Text);
}public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e)
{
byte[] readBuffer = new byte[spReceive.ReadBufferSize];
spReceive.Read(readBuffer, 0, readBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
}private void UpdateTextBox(string text)
{
txtReceive.Text = text;
}
。
你com2送应该就从com2接受吧?
啊, 难道不是一个接收一个发送吗?
COM2负责接收自己发送的信息吗?能再详细点吗
new Thread((ThreadStart)delegate
{
while(serial.IsOpen)//你的线程循环条件,假设为串口打开
{
int min = 0,max = 0;
this.Invoke((EventHandler)delegate
{
min = ProgressBar1.Minimum;
max = ProgressBar1.Maximum;
});//同步了
for (int i = min; i < max; i++)
{
this.Invoke((EventHandler)delegate{ProgressBar1.Value = i;});
}
}
}).Start();
http://blog.csdn.net/wuyazhe/category/695097.aspx
{
MyPort = new SerialPort(port);
MyPort.BaudRate = 9600;
MyPort.DataBits = 8;
MyPort.ReadTimeout = 5000;
MyPort.StopBits = System.IO.Ports.StopBits.None;
MyPort.Parity = System.IO.Ports.Parity.None;
MyPort.ReceivedBytesThreshold = 15;//引发DataReceived事件的输入缓冲区的字节数
MyPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived); }
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{ try
{
int n = MyPort.BytesToRead;//读取当前有多少数据可读。
byte[] buffer = new byte[n];//新建内容。
MyPort.Read(buffer, 0, n);//读取缓冲区
Array.Resize(ref byte_return, n);//改写数组大小
if (n < 1) { return; }//如果未收到数据则返回
//信息长度如果等于15的话。说明接受完了。接受完了就设置receive为真。
buffer.CopyTo(byte_return, 0);//复制数据。
if (byte_return.Length == 15)
{
Received = true;
return;
}
}
catch (Exception ex)
{ throw;
} }
就是说Serialport是在后台声明的, 并不是form里的控件?
{
try
{
Open();//打开端口
byte_return = new byte[] { };//重新初始化返回字节数组。
Received = false;//设置标识为没有接受到信息
MyPort.Write(SendValues, 0, SendValues.Length);//写入串口协议命令。
double timespan = DateTime.Now.TimeOfDay.TotalSeconds;//记录下当前总计秒数
do
{
//Application.DoEvents();//释放CPU
} while ((Received != true) && (DateTime.Now.TimeOfDay.TotalSeconds - timespan < _timeout));
if (Received == false)
{
Close();
return null;
}
//如果接受到了数据或者已超时就不再循环。
Close();
return byte_return;
}
catch (Exception ex)
{
return null;
}
}