加上下列编码便可完成支持汉字的特性,可以支持GB2312汉字
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort1.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);//串口数据接收事件
serialPort1.Encoding = Encoding.GetEncoding("GB2312");//串口接收编码
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; //
}
下位机每收到一个字节的数据的时候都会中断一次,软件是4个字节中断一次
操作系统的串口是非实时性的,所以一次串口中断可能是多个字节,PC端不是实时响应的,是隔一段时间响应的
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
//串口接收事件
{
if (!radioButton3.Checked)
{
textBox1.AppendText(serialPort1.ReadExisting());
//串口类会自动处理汉字,所以不需要特别转换(缓冲区的字符推送到TEXBOX中)
}
else//单字节接收
{
//收到的字节是个数组,所以需要定义一个数组serialPort1.BytesToRead就是需要读取的中断字节数
byte[] data = new byte[serialPort1.BytesToRead];
//定义缓冲区,因为串口事件触发时有可能收到不止一个字节
serialPort1.Read(data, 0, data.Length);//data.Length等同于serialPort1.BytesToRead输入的数组长度
foreach (byte Member in data) //遍历用法
{
string str = Convert.ToString(Member, 16).ToUpper();
textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
}
}
}
ADC数据的显示方法
接10K电位器
KILE上
void main (void){
//unsigned char R;
//初始程序
UART_init();
Read_init(7);
while(1){
ADC_Read ();
UART_T (ADC_RES); //串口小秘书,在括号里放入需要观察的数值(char)
DELAY_MS (1000);//做了1s钟的延迟
}
}
ADC输入是P1.7(17) ,电位器左边接5V,右边接GND,中间接1.7管脚
串口波特率4800
发送间隔1秒
可以接光敏电阻,温度电阻之类的
串口是在另一个线性程上处理的,所以不能操作主线程序处理这个东西,加个开关可以防止跨线程操作的东西
跨线程是指在WINDOW中有好多个进程,他只有一个进程,但是内部是有线程的,主线程就好像我们看到的QQ界面或者网络通信线程,它负责在后台。就好像微信中有没有好友发消息,有没有新闻要推送。一个线程在操作另一个线程的东西的时候,容易产生一个并发错误,其实不太容易涉及到这些东西
可以百度下“并发错误”了解下
其中System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
就是默认它进行多线程的检查操作,线程间的操作检查,这样我们就可以在操作那些其他窗口
public partial class Form1 : Form
{
public Form1()//构造函数
{
InitializeComponent();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(PortDataReceivedEvent);
//**添加串口数据接受事件**
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
//串口是在另一个线性cheng上处理的,所以不能操作主线程序这个东西
}
ADC
private void PortDataReceivedEvent(object sender, SerialDataReceivedEventArgs args)
//串口数据接收
{
byte Data = (byte)serialPort1.ReadByte();
//读字节
progressBar1.Value = Data;
//进度条赋值
}
按下打开串口就是要接收数据了
窗体的大小
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
//判断
{
groupBox2.Visible = false;
//第二个框框可见
this.Size = new Size(620, 117);
//缩小
serialPort1.Close();
//此处可不加try,catch
button1.Text = "打开串口";
}
else
{
try
{
serialPort1.PortName = comboBox1.Text;
//串口号
serialPort1.Open();
//打开
groupBox2.Visible = true;
//第二个框框可见
this.Size = new Size(620, 172);
//放大
button1.Text = "关闭串口";
//按键标题
}
catch
{
MessageBox.Show("串口打开错误", "错误");
}
}
}
}