RS232串口
一般个人计算机上都有两个串口。COM1和COM2。这两个串口就是RS232串口。
232有25芯和9芯串口之分。串口使用ASCII码字符传输,通信使用三根线完成。地线,发送线,和接收线。一根用来发送一根接受,其他线用来握手。
232串口常用参数设置:
1.波特率
用来表示传输速率。即每秒中传输的位数。9600波特率就是每秒传输9600bit数据。波特率与传输距离成反比。波特率越高传输距离越短。
2.数据位
如果使用标准ASCII码,那么没个数据包是7位,对应到一个字节,应把最高位设置为0.再加上开始停止位,奇偶校验位。一个数据包形式为:开始位.数据0,数据1,数据2……数据7,校验位,停止位。当传输的数据是扩展的ASCII码时,数据位就设置为8位。
3.停止位
用于表示单个数据包的最后一位。典型值1,1.5,2位。
4.奇偶校验位
奇偶校验是一种检验但马传输正确性的方法。根据一组二进制数位中的1和0的个数进行校验。
比如:
其他的:
1.RS232传输速率
RS-232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。
按9600波特率来说, 1个起始位 8个数据位 1个停止位,9600/10=960Bytes,每秒钟数据量不超过960字节
2.RS232传输距离
RS-232-C标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的d电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。
3.9芯RS232串口
4.TTL232和RS232C的区别
逻辑电平不同:TTL232的0是用0v表示。1是用5V表示。RS232的0是用+3V到+15V表示,1是用-3V到-15V表示。
5.TTL232和RS232如何转换
很多单机片的串口是TTL串口,电源电压一般是5V,如果要互联的话必须要做转换。通常用Max232芯片
Code:
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 SerialPort sp = null; 9 Thread t = null; 10 private void Form1_Load(object sender, EventArgs e) 11 { 12 Init(); 13 } 14 15 private void Init() 16 { 17 cboCOMPort.Items.Clear(); 18 string[] strs = SerialPort.GetPortNames(); 19 20 if (strs != null) 21 { 22 cboCOMPort.Items.AddRange(strs); 23 cboCOMPort.SelectedIndex = 0; 24 } 25 else 26 { 27 MessageBox.Show("无串口"); 28 } 29 30 cboBaudRate.Items.Add("9600"); 31 cboBaudRate.Items.Add("19200"); 32 cboBaudRate.Items.Add("38400"); 33 cboBaudRate.Items.Add("43000"); 34 cboBaudRate.Items.Add("56000"); 35 cboBaudRate.Items.Add("57600"); 36 cboBaudRate.Items.Add("115200"); 37 cboBaudRate.SelectedIndex = 0; 38 39 cboStopBits.Items.Add("0"); 40 cboStopBits.Items.Add("1"); 41 cboStopBits.Items.Add("1.5"); 42 cboStopBits.Items.Add("2"); 43 cboStopBits.SelectedIndex = 1; 44 45 cboDataBits.Items.Add("8"); 46 cboDataBits.Items.Add("7"); 47 cboDataBits.Items.Add("6"); 48 cboDataBits.Items.Add("5"); 49 cboDataBits.SelectedIndex = 0; 50 51 cboParity.Items.Add("无"); 52 cboParity.Items.Add("奇校验"); 53 cboParity.Items.Add("偶校验"); 54 cboParity.SelectedIndex = 0; 55 56 57 } 58 59 private void btnOpen_Click(object sender, EventArgs e) 60 { 61 sp = new SerialPort(); 62 sp.PortName = cboCOMPort.Text.Trim(); 63 sp.BaudRate = Int32.Parse(cboBaudRate.Text.Trim()); 64 float f = Convert.ToSingle(cboStopBits.Text.Trim()); 65 if (f == 0) sp.StopBits = StopBits.None; 66 else if (f == 1) sp.StopBits = StopBits.One; 67 else if (f == 2) sp.StopBits = StopBits.Two; 68 else if (f == 1.5) sp.StopBits = StopBits.OnePointFive; 69 sp.DataBits = Convert.ToInt16(cboDataBits.Text.Trim()); 70 string s = cboParity.Text.Trim(); 71 if (s.CompareTo("无") == 0) sp.Parity = Parity.None; 72 else if (s.CompareTo("奇校验") == 0) sp.Parity = Parity.Odd; 73 else if (s.CompareTo("偶校验") == 0) sp.Parity = Parity.Even; 74 else sp.Parity = Parity.None; 75 76 sp.ReadTimeout = -1; 77 78 try 79 { 80 sp.Open(); 81 sp.DataReceived+=new SerialDataReceivedEventHandler(sp_DataReceived); 82 btnOpen.Enabled = false; 83 btnClose.Enabled = true; 84 85 this.tbReceive.AppendText(sp.ReadExisting()); 86 } 87 catch (Exception ex) 88 { 89 MessageBox.Show("打开串口失败:" + ex.Message); 90 } 91 } 92 93 private void btnSend_Click(object sender, EventArgs e) 94 { 95 if (sp.IsOpen) 96 { 97 try 98 { 99 sp.WriteLine(tbSend.Text.Trim()); 100 } 101 catch (Exception ex) 102 { 103 MessageBox.Show("发送失败:" + ex.Message); 104 } 105 } 106 else 107 { 108 MessageBox.Show("串口未打开"); 109 return; 110 } 111 } 112 113 private void cboCOMPort_SelectedIndexChanged(object sender, EventArgs e) 114 { 115 btnOpen.Enabled = true; 116 btnClose.Enabled = false; 117 } 118 119 private void btnClose_Click(object sender, EventArgs e) 120 { 121 try 122 { 123 sp.Close(); 124 btnClose.Enabled = false; 125 btnOpen.Enabled = true; 126 } 127 catch (Exception ex) 128 { 129 MessageBox.Show("关闭失败" + ex.Message); 130 return; 131 } 132 } 133 134 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 135 { 136 if (sp != null && sp.IsOpen) sp.Close(); 137 if (t != null && t.IsAlive) 138 t.Abort(); 139 } 140 141 public void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 142 { 143 string readString = sp.ReadExisting(); 144 this.Invoke(new Action(delegate { 145 tbReceive.Text += readString+" "; 146 })); 147 } 148 149 }