基于c#环境的单片机和PC串口通信

2019-04-15 17:42发布

c#程序: using System; using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            SendData(sendtxt.Text);
        }


        private void SendData(string data)
        {
            byte[] senddata=new byte[1];
            //senddata[0] = Convert.ToByte(data,2);
            senddata= Encoding.Default.GetBytes(data);
            serialPort1.Write(senddata,0,1);
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            SetComConfig();
        }


        private void SetComConfig()
        {
            serialPort1.PortName = "COM2";
            serialPort1.BaudRate = 4800;
            serialPort1.Open();
        }


        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            ReceivedData();
        }


        private void ReceivedData()
        {
            byte[] sbufdata=new byte[1];
            serialPort1.Read(sbufdata,0,1);
            receive.Invoke((EventHandler)delegate{
                //receive.Text = Convert.ToString(sbufdata[0],2);
                receive.Text = Encoding.Default.GetString(sbufdata);
            });
            
        }
    }
}
单片机程序:
  1. #include   
  2. #include     
  3. #include   
  4.   
  5. sbit LS138A = P2^2;     //定义138译码器的输入A脚由P2.2控制   
  6. sbit LS138B = P2^3;     //定义138译码器的输入脚B由P2.3控制  
  7. sbit LS138C = P2^4;     //定义138译码器的输入脚C由P2.4控制  
  8.   
  9. unsigned char ch;  
  10. bit read_flag= 0 ;  
  11. //此表为 LED 的字模, 共阴数码管 0-9  -   
  12. unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};   
  13. void delay(unsigned int i);  
  14. void init_serialcom( void )  
  15.   
  16.    {  
  17.   
  18.        SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr    
  19.   
  20.                          //UART为模式1,8位数据,允许接收  
  21.   
  22.           TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload              
  23.   
  24.                          //定时器1为模式2,8位自动重装  
  25.   
  26.           PCON |= 0x80 ; //SMOD=1;  
  27.   
  28.           TH1 = 0xF3;                   // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)  
  29.   
  30.           IE |= 0x90 ;     //Enable Serial Interrupt  
  31.   
  32.           TR1 = 1 ;       // timer 1 run  
  33.   
  34.           TI=1;  
  35.   
  36.            
  37.   
  38.        }  
  39.   
  40.            
  41.   
  42. //向串口发送一个字符  
  43.   
  44. void send_char_com( unsigned char ch)  
  45.   
  46.          {  
  47.             SBUF=ch;  
  48.             while (TI== 0);  
  49.                TI= 0 ;  
  50.   
  51.           }  
  52.   
  53.    
  54.   
  55. //串口接收中断函数  
  56.   
  57. void serial () interrupt 4 using 3  
  58.   
  59. {  
  60.     if (RI)  
  61.           {   
  62.   
  63.                  RI = 0 ;  
  64.   
  65.                  ch=SBUF;   
  66.                    
  67.                  read_flag= 1 ; //就置位取数标志  
  68.   
  69.               }  
  70.   
  71. }  
  72.   
  73.    
  74.   
  75.  main()  
  76.   
  77.     {  
  78.     int LedNumVal = 0;  
  79.     unsigned char LedOut[3];  
  80.     int i = 0;  
  81.   
  82.            init_serialcom(); //初始化串口  
  83.   
  84.                   while ( 1 )  
  85.                   {  
  86.   
  87.                     if (read_flag) //如果取数标志已置位,就将读到的数从串口发出  
  88.   
  89.                     {  
  90.   
  91.                      read_flag= 0 ; //取数标志清0  
  92.                      send_char_com(ch);  
  93.                      LedNumVal = ch;  
  94.                      }  
  95.   
  96.      LedOut[0]=Disp_Tab[LedNumVal / 100];  
  97.      LedOut[1]=Disp_Tab[(LedNumVal / 10) % 10];  
  98.      LedOut[2]=Disp_Tab[LedNumVal % 10]|0x80;  
  99.        
  100.   
  101.      for( i=0; i<3; i++)  //实现8位动态扫描循环  
  102.      {     
  103.       P0 = LedOut[i];  //将字模送到P0口显示  
  104.                                                
  105.       switch(i)   //使用switch 语句控制位选   
  106.          {        
  107.             case 0:LS138A=0; LS138B=0; LS138C=0;  break;           
  108.             case 1:LS138A=1; LS138B=0; LS138C=0;  break;  
  109.             case 2:LS138A=0; LS138B=1; LS138C=0;  break;                  
  110.          }  
  111.     delay(100);    
  112.       }  
  113.                    }  
  114. }  
  115.   
  116. void delay(unsigned int i)  
  117. {  
  118.     char j;  
  119.     for(i; i > 0; i--)  
  120.         for(j = 200; j > 0; j--);  
  121. }

or