程序运行后,textbox没有显示
private void Form1_Load(object sender, EventArgs e)
{
try
{
string[] str = SerialPort.GetPortNames(); //获取连接到电脑的串口号并存进数组
if (str.Length > 0)
{
serialPort1.PortName = "com5";
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits =StopBits.Two;
serialPort1.Encoding = Encoding.BigEndianUnicode;
serialPort1.Open();
}
else
{
MessageBox.Show("当前无串口连接!");
}
}
catch
{
MessageBox.Show("无串口设备!/r/n请检查是否连接设备!/r/n请检查设备驱动!");
}
}
//向低阻仪发送
private void timer1_Tick(object sender, EventArgs e)
{
char c1 = (char)259; //01H 03H
char c2 = (char)0001; //00H 01H
char c3 = (char)0014; //00H 0EH
char c4 = (char)38350; //95H CEH
string OutData = c1.ToString() + c2.ToString() + c3.ToString() + c4.ToString();
serialPort1.Write(OutData);
}
//触发事件,读取低阻仪返回数据
private int receiveCount = 0;
List<byte> sp_buffer = new List<byte>(4096); //串口缓存区
int sp_buffer_max = 4096; //串口缓存区最大缓存字节数
byte[] data = new byte[9192]; //用来存放缓冲区的数据流
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int Byte_len = serialPort1.BytesToRead; //读取缓存的数据长度
byte[] Rc_byte = new byte[Byte_len];
receiveCount++;
serialPort1.Read(Rc_byte, 0, Byte_len); //将缓存数据存储进字节数组里面
if (sp_buffer.Count > sp_buffer_max) //缓存超过字节数 先丢弃前面的字节
sp_buffer.RemoveRange(0, sp_buffer_max); //丢弃前面的字节0到sp_buffer_max
if (receiveCount == 3)
{
sp_buffer.AddRange(Rc_byte); //存入缓存区
if (sp_buffer.Count > 26)
{
sp_buffer.CopyTo(0, data, 0, sp_buffer.Count);
this.Invoke(new EventHandler(DisplayText));
}
}
}
private void DisplayText(object sender,EventArgs e)
{
short data2;
string data7 = Encoding.Default.GetString(data, 0, sp_buffer.Count);
char[] data1 = data7.ToCharArray();
string data3 = "", data4 = "", data5 = "", data6 = "";
for (int i = 0; i < data1.Length; i++)
{
data2 = (short)data1[i];
string hexData = Convert.ToString(data2, 16);
if (hexData.Length >= 16)
{
data3 = hexData.Substring(14, 2) + hexData.Substring(12, 2) + hexData.Substring(10, 2) + hexData.Substring(8, 2);
}
if (hexData.Length >= 32)
{
data4 = hexData.Substring(28, 2) + hexData.Substring(26, 2) + hexData.Substring(24, 2) + hexData.Substring(22, 2);
}
if (hexData.Length >= 48)
{
data5 = hexData.Substring(42, 2) + hexData.Substring(40, 2) + hexData.Substring(38, 2) + hexData.Substring(36, 2);
}
if (hexData.Length >= 64)
{
data6 = hexData.Substring(56, 2) + hexData.Substring(54, 2) + hexData.Substring(52, 2) + hexData.Substring(50, 2);
}
}
textBox1.Text = DataChenge(data3).ToString();
textBox2.Text = DataChenge(data4).ToString();
textBox3.Text = DataChenge(data5).ToString();
textBox4.Text = DataChenge(data6).ToString();
}
private float DataChenge(string s)
{
MatchCollection matches = Regex.Matches(s, @"[0-9A-Fa-f]{2}");
byte[] bytes = new byte[matches.Count];
for (int i = 0; i < bytes.Length; i++)
bytes[i] = byte.Parse(matches[i].Value, System.Globalization.NumberStyles.AllowHexSpecifier);
float m = BitConverter.ToSingle(bytes.Reverse().ToArray(), 0);
return m;
}
先确认你的定时事件是否触发,再看是否有什么错误。你现在截图只是说程序运行后,textbox没有显示,无法判断原因啊!
不是刚发过吗,回调函数没注册
源于chatGPT仅供参考
根据您提供的代码,问题可能出现在以下几个方面:
1. 检查控件属性:确保`textBox1`、`textBox2`、`textBox3`和`textBox4`这些文本框的`Visible`属性设置为`true`,以便在窗体中可见。
2. 确保事件绑定正确:请确认`Form1_Load`方法中的`serialPort1_DataReceived`事件绑定正确。可以通过在`Form1_Load`方法中添加以下代码来绑定事件:`serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);`。
3. 跨线程操作控件:在`DisplayText`方法中修改了文本框的内容,需要确保使用适当的线程间调用方法。可以使用`Invoke`方法来更新UI线程上的控件值,如下所示:
```csharp
private void DisplayText(object sender, EventArgs e)
{
// ...
this.Invoke(new Action(() =>
{
textBox1.Text = DataChenge(data3).ToString();
textBox2.Text = DataChenge(data4).ToString();
textBox3.Text = DataChenge(data5).ToString();
textBox4.Text = DataChenge(data6).ToString();
}));
}
确保在调用Invoke
时传递正确的委托或方法。
MessageBox.Show
方法显示错误消息,以便更好地了解出现的问题。如果您仍然遇到问题,请提供更多关于问题的详细信息,例如错误消息、程序行为等。这将有助于我更好地理解问题并提供进一步的帮助。
```
根据你提供的代码,textbox没有显示的原因可能是以下几个方面:
控件属性未正确设置:请确保你的窗体(Form1)上的textbox控件(textBox1、textBox2、textBox3、textBox4)的Visible属性设置为true,以便在运行时显示。
事件处理方法未正确关联:在Form1的构造函数或设计器中,请确保DisplayText
方法正确关联到serialPort1_DataReceived
事件。可以通过在Form1_Load方法中添加以下代码来关联事件:
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
串口通信设置问题:请确保串口通信的设置与低阻仪的要求相匹配。检查以下设置是否正确:波特率(BaudRate)、数据位(DataBits)、校验位(Parity)、停止位(StopBits)。
串口缓存区处理问题:请检查数据是否正确接收和处理。确保在serialPort1_DataReceived
方法中的缓存区处理逻辑正确,并将正确的数据传递给DisplayText
方法。
请逐一检查这些问题,并确保代码逻辑正确、控件设置正确。如果问题仍然存在,请提供更多关于问题的详细信息,以便我能够更好地帮助你解决问题。
可以断点调试看看有没有写入成功吧
或者试试AppendText
将PasswordChar设置为特殊字符后 ,原来文本框中的显示内容就会变为该特殊字符。
在原来的文本框1中输入12345,打印如下:
特性:
可能是因为你的Textbox控件没有设置Dock或Anchor属性,或者位置不正确。你可以在Form1_Load方法中添加以下代码以确保Textbox控件可见:
textBox1.Dock = DockStyle.Top;
textBox2.Dock = DockStyle.Top;
textBox3.Dock = DockStyle.Top;
textBox4.Dock = DockStyle.Top;
这将使四个Textbox控件紧贴窗体顶部排列,并随窗体大小调整而调整位置。如果你需要更细粒度的控制,你可以使用Anchor属性来锚定控件的位置。例如:
textBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left;
textBox2.Anchor = AnchorStyles.Top | AnchorStyles.Right;
textBox3.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
textBox4.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
这将使Textbox1固定在窗体左上角,Textbox2固定在右上角,Textbox3固定在左下角,Textbox4固定在右下角。
Dock和Anchor是Windows窗体中常用的两个属性,它们可以用来控制控件在窗体中排列的方式和随窗体大小变化的位置。下面是对这两个属性的详细描述:
Dock属性
Dock属性可以设置窗体中的控件停靠的位置。在窗体大小发生改变时,该控件停靠的位置会随之改变。DockStyle枚举列出了控件可能的停靠位置,包括:
Top:控件停靠在窗体顶部
Bottom:控件停靠在窗体底部
Left:控件停靠在窗体左侧
Right:控件停靠在窗体右侧
Fill:控件充满整个窗体
Anchor属性
Anchor属性可以设置控件的锚定方式,在窗体大小发生改变时,该控件的位置和大小会根据其锚定方式自动调整。AnchorStyles枚举列出了控件可能的锚定方式,包括:
Top:锚定到控件顶部
Bottom:锚定到控件底部
Left:锚定到控件左侧
Right:锚定到控件右侧
在设计窗体时,你可以根据需要使用单个或多个锚定方式。例如,如果你想要一个控件始终位于窗体的左上角,则可以将其设置为锚定到窗体的左上角:
myControl.Anchor = AnchorStyles.Top | AnchorStyles.Left;
当窗体大小发生改变时,控件的位置和大小会自动调整以使其保持左上角的位置。