USB模拟串口实现电脑与MCU通信


功能

通过C#将图片转化成数组并传输到MCU中

一、上位机

1. (主要介绍通信部分)

代码如下(示例):

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

            int reads = serialPort1.BytesToRead;
            byte[] rdBuf = new byte[4096];
            byte[] finishBytes = new byte[1];
            finishBytes[0] = 0xa1;
            int len = outBuffer.Length;
            serialPort1.Read(rdBuf, 0, reads);
            if (send_offset >= len)
            {               
                serialPort1.Write(finishBytes, 0, 1);
                MessageBox.Show("发送完毕");
            }
            else
            {
                if (reads >= 3)
                {
                   if (rdBuf[0] == 0xa0)
                        send_picture(outBuffer, send_offset, 507);
                   Urat_tx_timer = 0;          
                }
            }
        }
        private void button_com_open_Click(object sender, EventArgs e)
        {
            try
            {
                if (button_com_open.Text == "打开串口")
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.Open();
                    if (serialPort1.IsOpen)
                    {
                        button_com_open.Text = "关闭串口";
                    }

                }
                else
                {
                    serialPort1.Close();
                    button_com_open.Text = "打开串口";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button_com_send_Click(object sender, EventArgs e)
        {
            TimerInit();
            send_picture(outBuffer, 0, 507);

        }
        private void send_picture(byte[] Buf, int offset32, int length)
        {
            byte temp = 0;
            if ((offset32 + length) > Buf.Length)
            {
                length = Buf.Length - offset32 + 7;
            }
            byte[] writeBytes = new byte[length];
            writeBytes[0] = 0xa0;
            writeBytes[1] = (byte)((length >> 8) & 0xff);
            writeBytes[2] = (byte)(length & 0xff);
            writeBytes[3] = (byte)((offset32 >> 16) & 0xff);
            writeBytes[4] = (byte)((offset32 >> 8) & 0xff);
            writeBytes[5] = (byte)(offset32 & 0xff);
            Array.Copy(Buf, offset32, writeBytes, 6, length-7);
            for (int j = 0; j < (length - 1) ; j++)
            {
                temp += writeBytes[j];
            }
            writeBytes[length-1] = temp;
            serialPort1.Write(writeBytes, 0, length);
            send_offset += (length-7);
            Urat_tx_timer = 0;

        }
        private void TimerInit()
        {
            timer_1.Enabled = true;
            timer_1.Interval = 1;//1毫秒
            timer_1.Tick += new EventHandler(timer_Name_Tick);
            timer_1.Start();
        }
        private void timer_Name_Tick(object sender, EventArgs e)
        {
            if (send_offset < outBuffer.Length)
            {
                //关闭定时器防止多次触发
                timer_1.Enabled = false;

                Urat_tx_timer++;
                if (Urat_tx_timer >= 50)
                {
                    send_offset -= 500;
                    send_picture(outBuffer, send_offset, 507);
                }
                //启动定时器
                timer_1.Enabled = true;
            }
        }

二、从机接收部分

1.代码如下(示例):

while (1)
    {
        checkByte=0;
        printf("wait command..... \n\n");

        rlen = 0;
        memset((void*)rbuf, 0x0, BUF_LEN);

        rlen = read(ITP_DEVICE_USBDACM, rbuf, BUF_LEN);
        //printBuf("rdbuf",rbuf,rlen);
        if(rbuf[0]==0xa1)
            break;
        for(int j=0;j<rlen-1;j++)
        {
            checkByte+=rbuf[j];
        }        
        if((rbuf[0]==0xa0)&&(checkByte==rbuf[rlen-1]))
        {
            size0 = (uint8_t)((rlen>>8)&0xff);
            size1 = (uint8_t)(rlen&0xff);   
            if ((rbuf[1]==size0) &&(rbuf[2]==size1))
            {         
                memcpy(&WriteBuf[get_offset],&rbuf[6],rlen-7);                
                //printBuf("WriteBuf",&WriteBuf[get_offset],rlen-7);
                get_offset+=(rlen-7);
                
                memcpy(buf,rbuf,6);            
                len = strlen(buf);
                write(ITP_DEVICE_USBDACM, buf, len);
                k++;
                printf("\n K=%d\n", k);        
            }                                                                         
            //usleep(200*1000);                                    
        }
    }


总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值