cuốn sách gpt4 ai đã làm

Không thể thiết lập giao tiếp RS485 chính xác

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 06:50:54 39 4
mua khóa gpt4 Nike

Tôi đang cố gắng sử dụng ATmega32 Thực hiện giao tiếp nối tiếp. Đầu tiên, tôi thiết lập việc thu và truyền bằng thiết bị đầu cuối nối tiếp (thuật ngữ tera trong trường hợp của tôi) bằng RS232, sử dụng USB-to-RS232. Bất cứ điều gì tôi gửi từ thiết bị đầu cuối nối tiếp Atmega32, nó đều phản hồi lại.

Ví dụ. tôi gửi Xin chào\r và nhận được 'Xin chào\r'

Nó hoạt động tốt.

Sau đó, tôi sử dụng RS485 để thiết lập liên lạc với ATmega32 bằng USB-to-RS485, nhưng tôi chỉ nhận được ký tự đầu tiên khi trả về.

Ví dụ. nếu tôi gửi Xin chào, tôi sẽ trở lại H. nếu tôi gửi hành tinh, tôi sẽ chỉ nhận được P như sự trở lại.

Mã này như sau:

Độ trễ trống (int ms)
{
int i;
cho (i=0;i<>
_delay_ms(1);

}

void UART_Init(unsign int baud)
{
UBRRH = (char không dấu)(baud >> 8);
UBRRL = (unsigned char)baud;

UCSRB = (1<<>
UCSRC = (1<<>
}

void UART_Transmit(dữ liệu char không dấu)
{
UDR = dữ liệu;
while ( !( UCSRA & (1<
}


void USART_Transmit_String(char *chuỗi)
{
trong khi (*chuỗi != 0)
UART_Transmit(*string++);
}


void Clear_Buffer(char *chuỗi)
{
trong khi (*string != '\0')
{
*chuỗi = 0;
chuỗi++;
}
}

ISR(USART_RXC_vect)
{
uartBuff[datapos] = UDR;
if (uartBuff[datapos] == '\r')
{
eos = 1;
}
dữ liệu ++;
nếu (datapos> KÍCH THƯỚC)
{
dữ liệu = 0;
Clear_Buffer(uartBuff);
}
}

int main(void)
{
_delay_ms(1000);
UART_Init(103);
sei();
LED_Enable();
LED_Cao();
Độ trễ (100);
LED_Thấp();
Độ trễ (100);

RE_DE_Enable();
RE_DE_High();
USART_Transmit_String("Xin chào thế giới");
UART_Transmit(0x0d);
UART_Transmit('\n');
Độ trễ (1000);
dữ liệu = 0;
eos = 0;
RE_DE_Thấp();
trong khi (1)
{
if (strstr(uartBuff,"led on\r"))
{
LED_Cao();
}
if (strstr(uartBuff,"led off\r"))
{
LED_Thấp();
}

nếu (eos == 1)
{
RE_DE_High();
uartBuff[datapos] = '\0';
USART_Transmit_String("\r\n");
USART_Transmit_String(uartBuff);
USART_Transmit_String("\r\n");
Clear_Buffer(uartBuff);
dữ liệu = 0;
eos = 0;
RE_DE_Thấp();
}

}
}

Tại sao ngoại lệ này xảy ra?

Làm thế nào để sửa lỗi này?

Mọi đề xuất sẽ hữu ích.

提前致谢

câu trả lời hay nhất

Tôi hơi bối rối không biết ai đang truyền tải điều gì khi xem bài đăng này, vì vậy đây là nhận xét:

1) Đơn giản hóa mã Atmel để chỉ phát trực tiếp "Hello World %d" + CR và tiếp tục tăng dòng #. Bây giờ, hãy giữ tốc độ liên lạc @ 9600 baud. 100% lưu lượng truy cập từ Atmel đến USB RS485 dongle có được nhận thành công không? Đừng tiếp tục cho đến lúc đó.

2) Bạn đã sử dụng bộ thu phát RS485 nào cho phía Atmel trong thiết kế này? Có rất nhiều thứ vớ vẩn trên thị trường và không phải tất cả các máy thu phát đều được tạo ra như nhau.

3) Bạn đang sử dụng USB RS485 nào? Theo (2), chỉ có một số ít là đáng tin cậy. Nếu sử dụng khóa FTDI USB RS485 trong suốt, hãy kiểm tra thật kỹ bộ thu phát RS485 được đóng dấu bên trong nhựa. FTDI thừa nhận rằng họ đã phát hành một số loại cáp dongle mỏng manh dựa trên bộ thu phát Sipex. Từ đánh giá ngắn gọn của chúng tôi, người ta tin rằng vấn đề là ở thiết kế chứ không phải ở bộ thu phát. Nhưng dù thế nào đi nữa, bây giờ dongle đã bị niêm phong, dongle bị lỗi tương tự không thể sửa chữa được.

Chúng tôi đã tạo một số bộ điều hợp chắc chắn nhưng không muốn biến chúng thành quảng cáo, vì vậy hãy xem liệu chúng tôi có thể gỡ lỗi cho trường hợp của bạn hay không. Đăng thêm chi tiết để tiếp tục.

Để thêm phần này vào chân bộ thu RS485 của bạn, hãy đảm bảo có điện trở kéo lên cục bộ lên +3v3. Điều này yêu cầu trạng thái cao trên Atmel Nhận trên UART khi bộ thu RS485 bị tắt. Tức là khi bộ thu RS485 bị vô hiệu hóa, chân RX có trở kháng cao. Giá trị 10k được biết là tốt, giá trị không quan trọng nhưng nên sử dụng pull-up.

gia hạn

Tôi nghĩ tôi hiểu quan điểm của dự án của bạn. Hãy sửa tôi nếu tôi sai. Bạn đã thử sử dụng khóa Teraterm + USB RS485 để gửi văn bản tới Atmel qua RS485 và muốn Atmel gửi dữ liệu trở lại Teraterm của bạn chưa? Nếu có, thì nếu bạn nhập dữ liệu này vào Teraterm, kết quả sẽ hợp lý. Vui lòng xác nhận cài đặt này.

Tức là bạn đang gõ "Xin chào thế giới" và mong nhận được tin nhắn này?

Vấn đề với ý tưởng này là PC có thể gửi dữ liệu nhanh hơn tốc độ bạn nhập dữ liệu. Thay vào đó, hãy xem cách sử dụng Teraterm để gửi toàn bộ chuỗi trong một khối dưới dạng macro. Chỉ có phương pháp này mới có tác dụng với ý tưởng của bạn. Khi bạn nhập, Teraterm sẽ gửi (tức là xóa bộ đệm tx) "H" qua giao diện RS485, v.v., do đó bạn không nhận được toàn bộ chuỗi trong một khối tiếp nhận.

Hãy cân nhắc việc sử dụng macro của Teraterm để gửi "các hành tinh", v.v. trong một lần gửi. Điểm mấu chốt không phải là độ trễ giữa mỗi ký tự bạn muốn gửi.

Về việc không thể thiết lập giao tiếp RS485 chính xác, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/51536139/

39 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress