欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: AVR單片機串口單線半雙工 [打印本頁]

作者: PythonS    時間: 2019-1-18 13:34
標題: AVR單片機串口單線半雙工
之前發了個帖子,沒有人回,自己琢磨了幾天,基本實現了功能,但是還有問題http://m.raoushi.com/bbs/dpj-148913-1.html


實現方法,串口信號線連接單片機的RX腳.然后單片機的RX和TX中間用一個100歐姆的電阻串聯


這樣做的話,單片機發出的數據可以通過RX腳傳輸到PC機上

數據顯示正常.但是如果PC機向單片機發數據,PC機自己的信號無法收到,(即無法自發自收,此時PC串口的RXTX是用680歐姆的電阻短接的,
如果串口信號單線空置的話,是可以自發自收)

同時,收到單片機返回的信號也是有問題的,比如PC發送123456789,收到的返回數據是13579,中間都漏一位

希望有人能解答我的困惑,多謝了

以下是程序代碼,
發送數據時關閉單片機的接收功能,避免單片機自發自收進出串口接收中斷
發送完畢后打開單片機的發送功能
#include <avr/io.h>        
#include <util/delay.h>
#include <avr/interrupt.h>   //中斷函數頭文件

//常量聲明
#define BAUD 9600
//全局變量聲明
unsigned char Transmit;

//函數聲明
void Port_Init(void);   //端口初始化配置
void Usart_Init(void);  //USART寄存器設置
void Usart_PutChar(unsigned char cTXData);  //字節發送函數
void Usart_PutString(unsigned char *pcString);

int main(void)            
{
        Port_Init();
        Usart_Init();

        sei();
        Usart_PutChar(0x31);

        while(1)
        {
                Usart_PutString("ABCC");
                _delay_ms(500);
        }
}

//端口狀態初始化設置函數
void Port_Init()
{
        PORTD = 0X00;          //USART的發送接收端口分別為PD0和PD1
        DDRD |= (1 << PD1);   //PD0為接收端口,置為輸入口;PD1為發送端口,置為輸出口
}

//USART寄存器配置函數
void Usart_Init()
{
    UCSR0C &= ~(1 << UCSZ00) ;  
    UCSR0C |= (1 << USBS0) ;  //異步,數據格式7,N,1
          UCSR0B |= (1 << TXCIE0) |(1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);    //發送使能,接收使能,接收中斷使能
    unsigned int UBRR;
    UBRR = F_CPU/16/BAUD - 1;
    UBRR0H = (uint8_t)(UBRR>>8);
    UBRR0L = (uint8_t)(UBRR);  //設置波特率
        }

//字節發送函數
void Usart_PutChar(unsigned char cTXData)
{
        UCSR0B &= ~(1 << RXEN0);
        while( !(UCSR0A & (1 << UDRE0)) );  //只有數據寄存器為空時才能發送數據
        {
        UDR0 = cTXData;                         //發送數據送USART I/O數據寄存器-UDR
        }
}

//接收中斷函數
ISR(USART0_RX_vect )
{

        unsigned char Rev0;
        Rev0 = UDR0;
        Usart_PutChar(Rev0);
  //從USART I/O數據寄存器-UDR中讀出數據
        if (Rev0==0x12)   //將接收到的數據發送
          {
          PORTA=0X00;
        DDRA=0XFF;
          }
}

ISR(USART0_TX_vect )
{
        cli();
        UCSR0B |= (1 << RXEN0 );  
        sei();
}


void Usart_PutString(unsigned char *pcString)
{
        while (*pcString)
        {
                Usart_PutChar(*pcString++);
        }
        Usart_PutChar(0x0D);
        Usart_PutChar(0x0A);  //結尾發送回車換行
}





作者: bucker    時間: 2019-1-20 13:22
建議你把用電阻的方法改為用電子開關來解決半雙工的問題,
作者: PythonS    時間: 2019-1-21 08:40
bucker 發表于 2019-1-20 13:22
建議你把用電阻的方法改為用電子開關來解決半雙工的問題,

那樣是簡單很多,但是項目限定了實現方法,只能加電阻和對程序修改
多謝你的回復了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1