C#中怎么对TextBox内容进行判断?

andywong008 2014-04-23 06:01:44
我对串口进行编程,向模块发送指令,当模块返回相应的应答包,会提示"首次录入成功".然后再发送相同指令,模块又返回相同的应答包,再提示"二次录入成功".这是我写的程序,但是总是首次录入成功之后,马上就二次录入成功,原因在哪里.?求各位大哥大姐指点一下迷津

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
using System.Threading;


namespace tttttest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort sp = new SerialPort();
public static string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
int Flag = 0;
public static byte[] baotou()
{
byte[] a = new byte[6];
a[0] = 0xEF;
a[1] = 0x01;
a[2] = 0xFF;
a[3] = 0xFF;
a[4] = 0xFF;
a[5] = 0xFF;
return a;
}

public static byte[] luru()
{
byte[] a = new byte[6];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x03;
a[3] = 0x01;
a[4] = 0x00;
a[5] = 0x05;
return a;
}


public static byte[] bf1()
{
byte[] a = new byte[7];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x04;
a[3] = 0x02;
a[4] = 0x01;
a[5] = 0x00;
a[6] = 0x08;
return a;
}

public static byte[] bf2()
{
byte[] a = new byte[7];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x04;
a[3] = 0x02;
a[4] = 0x02;
a[5] = 0x00;
a[6] = 0x09;
return a;
}

public static byte[] tezheng()
{
byte[] a = new byte[6];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x03;
a[3] = 0x05;
a[4] = 0x00;
a[5] = 0x09;
return a;
}

public static byte[] save()
{
byte[] a = new byte[9];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x06;
a[3] = 0x06;
a[4] = 0x01;
a[5] = 0x00;
a[6] = 0x0B;
a[7] = 0x00;
a[8] = 0x19;
return a;
}

public static byte[] search()
{
byte[] a = new byte[11];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x08;
a[3] = 0x04;
a[4] = 0x01;
a[5] = 0x00;
a[6] = 0x00;
a[7] = 0x03;
a[8] = 0xA1;
a[9] = 0x00;
a[10] = 0xB2;
return a;
}

public static byte[] search0_9()
{
byte[] a = new byte[11];
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x08;
a[3] = 0x04;
a[4] = 0x01;
a[5] = 0x00;
a[6] = 0x00;
a[7] = 0x00;
a[8] = 0x13;
a[9] = 0x00;
a[10] = 0x21;
return a;
}

private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = "";
if (sp.IsOpen)
{
sp.Close();
}
sp = new SerialPort();
sp.PortName = "COM11";
sp.BaudRate = 57600;
sp.Open();
byte[] buffer = new byte[12];
do
{
sp.Write(baotou(), 0, 6);
sp.Write(luru(), 0, 6);
sp.Read(buffer, 0, 12);
string ss;
ss = byteToHexStr(buffer);
textBox2.Text = ss;
Thread.Sleep(1000);
} while (Flag != 1);

sp.Write(baotou(), 0, 6);
sp.Write(bf1(), 0, 7);
Thread.Sleep(1000);
sp.Read(buffer, 0, 12);
string sss;
sss = byteToHexStr(buffer);
textBox2.Text = sss;

do
{
sp.Write(baotou(), 0, 6);
sp.Write(luru(), 0, 6);
sp.Read(buffer, 0, 12);
string ss;
ss = byteToHexStr(buffer);
textBox2.Text = ss;
Thread.Sleep(1000);
} while (Flag != 2);

sp.Write(baotou(), 0, 6);
sp.Write(bf2(), 0, 7);
Thread.Sleep(1000);
sp.Read(buffer, 0, 12);
string ssss;
ssss = byteToHexStr(buffer);
textBox2.Text = ssss;
}

private void textBox2_TextChanged(object sender, EventArgs e)
{
if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 0)
{
MessageBox.Show("首次录入成功", "提示");
textBox2.Text = "";
Flag = 1;
}
if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 1)
{
MessageBox.Show("二次录入成功", "提示");
textBox2.Text = "";
Flag = 2;
}
}
}
}
...全文
1060 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxyzjm62 2014-04-25
  • 打赏
  • 举报
回复
private void textBox2_TextChanged(object sender, EventArgs e) { if (textBox2.Text == "EF01FFFFFFFF07000300000A" ) { MessageBox.Show("第" + Flag.tostring + "录入成功", "提示"); textBox2.Text = ""; Flag = Flag +1; } }
kxyzjm62 2014-04-25
  • 打赏
  • 举报
回复
private void textBox2_TextChanged(object sender, EventArgs e) { if (textBox2.Text == "EF01FFFFFFFF07000300000A" ) { MessageBox.Show("i第" + Flag.tostring + "录入成功", "提示"); textBox2.Text = ""; Flag = Flag +11; } }
ZoresseroZ 2014-04-24
  • 打赏
  • 举报
回复
Flag = 1; return; } ……………… Flag = 2; return; } 加上return;就可以了
wsh_mar 2014-04-24
  • 打赏
  • 举报
回复
你这代码是这样写的当然了。。 首先 if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 0) { MessageBox.Show("首次录入成功", "提示"); textBox2.Text = ""; Flag = 1; } if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 1) { MessageBox.Show("二次录入成功", "提示"); textBox2.Text = ""; Flag = 2; } 你TextBox里面的数据肯定都是EF01FFFFFFFF07000300000A 对吧,然后 Flag ==0 也是成立的吧。 当然就进入首次录入成功。 第二个if 你textBox里的数据还是EF01FFFFFFFF07000300000A ,应该没错吧, 第一个if过后吧Flag设为1了, 第二个ifFlag == 1也是成立的了。 自然就跳到二次录入成功了。
lutaotony 2014-04-24
  • 打赏
  • 举报
回复
断点走一下会更加清楚
宇哥_ 2014-04-24
  • 打赏
  • 举报
回复
如果你这样写,就不应该写在textchanger事件中
andywong008 2014-04-24
  • 打赏
  • 举报
回复
引用 17 楼 Z65443344 的回复:
sp.Read(buffer, 0, 12); 这条语句是一次最多读12个字节 但是你串口返回的字节是1个1个来的 你每次都把当前返回的字节给str,str当然是一直在变,永远也变不成你想要的数据. 你需要把每次来的数据存起来,自己拼个串 而且不能用while(x!=y)的形式,否则某一次通信异常,你程序就死了 应该是while(串口缓冲区有数据) 结束后再判断字符串是否是你要的
但是为什么TextBox2还是会有时候变成正确的应答包?大哥方便写段给我看看吗...
桃子先生 2014-04-24
  • 打赏
  • 举报
回复
引用 8 楼 akuma8848 的回复:
直接flag=1不return,当然在一次事件中就俩都运行了。
楼上正解,你走第一个if的时候,flag就等于1,走第二个if的时候,当然满足条件了
Anymore 2014-04-24
  • 打赏
  • 举报
回复
直接flag=1不return,当然在一次事件中就俩都运行了。
zhenghao1977 2014-04-24
  • 打赏
  • 举报
回复
你的button事件有些问题啊,连续的发串口指令,一定会连续的相应的
於黾 2014-04-24
  • 打赏
  • 举报
回复
sp.Read(buffer, 0, 12); 这条语句是一次最多读12个字节 但是你串口返回的字节是1个1个来的 你每次都把当前返回的字节给str,str当然是一直在变,永远也变不成你想要的数据. 你需要把每次来的数据存起来,自己拼个串 而且不能用while(x!=y)的形式,否则某一次通信异常,你程序就死了 应该是while(串口缓冲区有数据) 结束后再判断字符串是否是你要的
andywong008 2014-04-24
  • 打赏
  • 举报
回复
谢谢各路大神!!由于不能连续回复就只能选着回复了. 另外还有个问题是关于C#串口数据的读取问题. 我发现串口在读取数据的时候好慢,所以导致我接收到的数据经常出错. 我的模块是: 发送一个指令,返送一个应答包.(应该是一帧一帧送的). 然后下面是问题: 我怎么能够实现,像串口调试助手那样,发一个指令它能回我一个正确的应答包.对速度无要求,只要实现效果就可以... 这是我自己写的代码,但是它在Textbox2里面要读很久才能显示,不知道是我的程序问题还是串口读取数据慢的问题.?
            do
            {
                sp.Write(baotou(), 0, 6);
                sp.Write(luru(), 0, 6);
                Thread.Sleep(1000);
                //sp.DiscardInBuffer();
                sp.Read(buffer, 0, 12);
                while (buffer.Length != 12) ;
                str = byteToHexStr(buffer);
                textBox2.Text = str;
                Thread.Sleep(1000);
            }while (!str.Equals("EF01FFFFFFFF07000300000A")) ;
             MessageBox.Show("首次录入成功", "提示");
andywong008 2014-04-24
  • 打赏
  • 举报
回复
引用 12 楼 wsh_mar 的回复:
你这代码是这样写的当然了。。 首先 if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 0) { MessageBox.Show("首次录入成功", "提示"); textBox2.Text = ""; Flag = 1; } if (textBox2.Text == "EF01FFFFFFFF07000300000A" && Flag == 1) { MessageBox.Show("二次录入成功", "提示"); textBox2.Text = ""; Flag = 2; } 你TextBox里面的数据肯定都是EF01FFFFFFFF07000300000A 对吧,然后 Flag ==0 也是成立的吧。 当然就进入首次录入成功。 第二个if 你textBox里的数据还是EF01FFFFFFFF07000300000A ,应该没错吧, 第一个if过后吧Flag设为1了, 第二个ifFlag == 1也是成立的了。 自然就跳到二次录入成功了。
非常感谢!!另外我想问下,我的指纹模块是: 发送一个指令,返送一个应答包.(应该是一帧一帧送的).我在串口调试中,每次发送录入指令,就很快地正常地返送一个应答包(每次都一样),但是当我在C#中用sp对串口循环发送一个指令,但是返送包的数据总是错的,我怀疑是串口缓冲区那边的数据出现问题.请问可以怎么解决?(我用了sp.DiscardInBuffer();函数,但是加了之后就不会不断检测,模块闪一下就不会闪了..正常的检测应该是一闪一闪的)
andywong008 2014-04-24
  • 打赏
  • 举报
回复
引用 8 楼 akuma8848 的回复:
直接flag=1不return,当然在一次事件中就俩都运行了。
非常感谢!!另外我想问下,我的指纹模块是: 发送一个指令,返送一个应答包.(应该是一帧一帧送的).我在串口调试中,每次发送录入指令,就很快地正常地返送一个应答包(每次都一样),但是当我在C#中用sp对串口循环发送一个指令,但是返送包的数据总是错的,我怀疑是串口缓冲区那边的数据出现问题.请问可以怎么解决?(我用了sp.DiscardInBuffer();函数,但是加了之后就不会不断检测,模块闪一下就不会闪了..正常的检测应该是一闪一闪的)
            do
            {
                sp.Write(baotou(), 0, 6);
                sp.Write(luru(), 0, 6);
                Thread.Sleep(1000);
                sp.DiscardInBuffer();
                sp.Read(buffer, 0, 12);
                str = byteToHexStr(buffer);
                textBox2.Text = str;
                Thread.Sleep(1000);
            }while (!str.Equals("EF01FFFFFFFF07000300000A")) ;
             MessageBox.Show("首次录入成功", "提示");
             textBox2.Text = str;
wind_cloud2011 2014-04-23
  • 打赏
  • 举报
回复
你在第二次if哪里设一个断点,看为何没有执行到这一步阿
煜宸0088 2014-04-23
  • 打赏
  • 举报
回复
textBox2.Clear();看看
煜宸0088 2014-04-23
  • 打赏
  • 举报
回复
第一个if执行完,第二个if的条件也满足了就又执行了
煜宸0088 2014-04-23
  • 打赏
  • 举报
回复
你那连个if有问题
andywong008 2014-04-23
  • 打赏
  • 举报
回复
顶一个...我饿着肚子发的啊...
andywong008 2014-04-23
  • 打赏
  • 举报
回复
正确的顺序应该是 检测 -- 手指按上去 -- 首次成功 -- 再检测 -- 手指再按上去 -- 二次成功.现在问题就是没有第二次检测(是不是没有回到原程序去了.?)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧