C#串口轮循关闭窗口就会报错,说此串口已经关闭是怎么回事,怎么判断该命令返回的数据包,没有对应的ID
我的大概代码是这样写的intincept=0;//接收数据包个数intsend=0;//发送数据包个数boolisOpen=false;intspaceInt=1000;...
我的大概代码是这样写的
int incept = 0;//接收数据包个数
int send = 0;//发送数据包个数
bool isOpen = false;
int spaceInt =1000;//每个数据包之间的间隔秒数
int intCorresp =1;//数据包对应的id默认的为第一个数据包id
ArrayList alCommand =new ArrayList();
private void Form1_Load(object sender, EventArgs e)
{
alCommand.Add("7E 33 32 30 31 32 39 34 32 45 30 30 32 31 0D");
alCommand.Add("7E 33 32 30 31 32 39 44 41 37 0D");
ThreadStart myTs = new ThreadStart(sendRce);//线程调用sendRce方法发送数据包
Thread mytd = new Thread(myTs);
mytd.Start();
}
/// <summary>
/// 发送命令
/// </summary>
private void sendRce()
{
for(int i=0;i<count;i++)//count表示轮循次数
{
for (int k = 0; k < alCommand.Count; k++)
{
Thread.Sleep(spaceInt);//spaceInt表示每个命令之间间隔秒数
string command = sp.strToAsc(alCommand[k].ToString());
serialport.WriteLine(command);
send++;//发送命令个数
}
Thread.Sleep(spaceInt*(alCount.Count+1));//spaceInt*(alCount.Count+1)表示轮循一次命令之间间隔秒数
}
}
///如果count=50表示轮循50次; 当count=0表示无限轮循,这个应该怎么写当轮循的时候没有轮循完。我就关闭窗口,在serialport.WriteLine(command)就会报错说此serialport已经关闭
/// <summary>
/// 每个数据包中info数据对应的执行方法
/// </summary>
/// <param name="dataInfo">数据包中info数据</param>
/// <param name="num">数据包对应的标识id</param>
public void sendCommand(string dataInfo,int num)
{
if (num == 1)
{
DataShow(dataInfo);改变第一个数据包的界面
}
else if (num == 2)
{
AlarmShow(dataInfo);改变第二个数据包的界面
}
}
public delegate void DataReceiveDelegate(object sender, EventArgs e);
private void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Invoke(new DataReceiveDelegate(CallData), new object[] {sender,e});
}
public void CallData(object sender, EventArgs e)
{
this.labSend.Text = send.ToString();//发送数据包个数
string DataRecTemp = serialport.ReadTo("\r") + "
string info=已经处理好的DataRecTemp 数据;
if(intCorresp>alCommand.Count)
{
intCorresp=1;
}
sendCommand(info, intCorresp);把响应数据包和数据包id传过去
intCorresp++;数据包对应的id默认的为第一个数据包id
incept++;//接收数据包个数
this.labIncept.Text = incept.ToString();
} 展开
int incept = 0;//接收数据包个数
int send = 0;//发送数据包个数
bool isOpen = false;
int spaceInt =1000;//每个数据包之间的间隔秒数
int intCorresp =1;//数据包对应的id默认的为第一个数据包id
ArrayList alCommand =new ArrayList();
private void Form1_Load(object sender, EventArgs e)
{
alCommand.Add("7E 33 32 30 31 32 39 34 32 45 30 30 32 31 0D");
alCommand.Add("7E 33 32 30 31 32 39 44 41 37 0D");
ThreadStart myTs = new ThreadStart(sendRce);//线程调用sendRce方法发送数据包
Thread mytd = new Thread(myTs);
mytd.Start();
}
/// <summary>
/// 发送命令
/// </summary>
private void sendRce()
{
for(int i=0;i<count;i++)//count表示轮循次数
{
for (int k = 0; k < alCommand.Count; k++)
{
Thread.Sleep(spaceInt);//spaceInt表示每个命令之间间隔秒数
string command = sp.strToAsc(alCommand[k].ToString());
serialport.WriteLine(command);
send++;//发送命令个数
}
Thread.Sleep(spaceInt*(alCount.Count+1));//spaceInt*(alCount.Count+1)表示轮循一次命令之间间隔秒数
}
}
///如果count=50表示轮循50次; 当count=0表示无限轮循,这个应该怎么写当轮循的时候没有轮循完。我就关闭窗口,在serialport.WriteLine(command)就会报错说此serialport已经关闭
/// <summary>
/// 每个数据包中info数据对应的执行方法
/// </summary>
/// <param name="dataInfo">数据包中info数据</param>
/// <param name="num">数据包对应的标识id</param>
public void sendCommand(string dataInfo,int num)
{
if (num == 1)
{
DataShow(dataInfo);改变第一个数据包的界面
}
else if (num == 2)
{
AlarmShow(dataInfo);改变第二个数据包的界面
}
}
public delegate void DataReceiveDelegate(object sender, EventArgs e);
private void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Invoke(new DataReceiveDelegate(CallData), new object[] {sender,e});
}
public void CallData(object sender, EventArgs e)
{
this.labSend.Text = send.ToString();//发送数据包个数
string DataRecTemp = serialport.ReadTo("\r") + "
string info=已经处理好的DataRecTemp 数据;
if(intCorresp>alCommand.Count)
{
intCorresp=1;
}
sendCommand(info, intCorresp);把响应数据包和数据包id传过去
intCorresp++;数据包对应的id默认的为第一个数据包id
incept++;//接收数据包个数
this.labIncept.Text = incept.ToString();
} 展开
1个回答
展开全部
serialport= new SerialPort(com, baudRate, parity, dataBits, stopbits);
serialport.Open();
然后才可以操作
程序退出时务必关闭串口
serialport.Open();
然后才可以操作
程序退出时务必关闭串口
更多追问追答
追问
我肯定打开了串口的啊,退出的时候也肯定会关闭啊!是轮循的时候我关闭窗体就会报错,因为串口已经关闭可是轮循没有结束它还是会写数据进去,所以才会报此串口已经关闭的错误。可是怎么样才能使它关闭窗体的时候把轮循结束掉。
追答
在FormClosing事件里面,mytd.Abort();
停止线程就可以了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询