توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل با usart
سلام آقایون خسته نباشید!
من یه مشکل دارم در برنامه زیر:
avrmp.ir/USART sample.rar
بعد از اینکه میکرو داده داد با کامپیوتر بهش داده می دم بعد این داده رو ال سی دی می نویسه!
ولی مشکل اصلی اینکه داده قبلی که به کامپیوتر داده رو هم می چسبونه به همون داده ای که بهش دادی می نویسه رو lcd!
نمی دونم منظورم رو متوجه شدید یا نه!
ولی برنامه رو تست کنید خودتون می فهمید!cry::
آخه چراا؟/
کمکککک!:x
اقا لینکی برای دانلود برنامه شما نیست !
احتمالا فایل شما آپلود نشده
درست آپلود شده بود چون رو هسته خودمه ولی من اسمشو عوض کردم که بهترشه:
You can see links before reply
ممنون از توجهتون!:018:
خوب مشکل اول شما سطر 13 برنامه هست این سطر
char havij[]=0;
شما متغییر هویج! رو تعریف کردید ولی طول آرایه به اون ندادید و در ضمن مقدار دهی صحیح رو هم انجام ندادید!
این سطر رو به این صورت تغییر بدید:
char havij[10]={0};
خوب نکته نه ایراد:
سطر 38 و تابع USART_ReadBuffer همان طور که قبلا گفتم این تابع برای دریافت رشته به صورت سخت افزاری عمل می کند نه نرم افزاری ، پس این تابع قسمت USART رو برای دریافت یه رشته اماده میکنه و منتظر دریافت کامل داده نمیشه {به خاطر این که وقت CPU گرفته نشه} شما باید برای استفاده بعد از این تابع Flag دریافت داده رو با While چک کنید که مطمئن بشید 10 کارکتر دریافت شده یا این که از مد اینتراپت استفده کنید.
راه ساده تر این که از تابع USART_Read و یک حلقه برای دریافت دیتا استفاده کنید
آقا ممنون از جوابتون مشکل با گفته شما حل شد ولی یه سوال دیگه!
می خواهم بهش بگم که وقتی enter زده شد به معنی دریافت کامل havij است!
و تعداد رقم ها رو هم رقم همون داده دریافتی قرار دهم ولی مشکل اینکه کاراکتر enter چیست؟؟؟
میشه یه برنامه نمونه برام همینجا بگذارید( لازم نیست فایلشو بگذارید فقط بنویسید)
ممنون میشم!:o
روی ال سی دی کاراکتر اینتر رو 4 تا خط فاصله روی هم نشون میده!!:unh:
کد Enter عدد 13 هست !
میتونی از این کد استفاده کنی:
i=0;
while(*(havij+i)!=13 && i<10)
*(havij+i++)=USART_Read(USART1,0);
این کد وقتی که شما Enter رو فشار میدی از حلقه خارج میشه و مقدار کارکتر دریافتی در متغییر i ذخیره میشه!
در ضمن اگه تعداد کارکتر دریافتی از 10 بیشتر شد نیز از حلقه خارج میشه{برای جلو گیری از آورفلو شدن متغییر}
آقا این کل برنامه منه:
#include <at91sam7s64.h>
#include <lib_at91sam7s64.h>
#include "usart.h"
#include "lcd4bit.h"
#include "delay.h"
#define BOAR_CLK 48000000
int main(void){
char buf[]="\r\nhello, world";
char buf1[]="\r\nThis Program Write By Mahan - Bastani.";
char buf2[]="\r\nThis Sample Publish In AVRMP.IR\n\r";
char i;
char havij[10]={0};
char buf4[]="please enter your password:\n\r";
// Activ Power USART 1
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1); // OR AT91C_ID_US0
USART_Configure_PIO(USART1_PORT,TXD1);// SET TXD0 T1 USART
USART_Configure_PIO(USART1_PORT,RXD1);// SET RXD0 T1 USART
USART_Configure(USART1,USART_MODE_ASYNCHRONOUS,384 00, BOAR_CLK); // Config Usart1
USART_SetTransmitterEnabled(USART1, 1); // ENABLE Transmitter
USART_SetReceiverEnabled(USART1, 1); // Enable Receiver
USART_Write(USART1,65,0);
USART_WriteBuffer(USART1,buf,sizeof(buf));
USART_WriteBuffer(USART1,buf1,sizeof(buf1));
USART_Write(USART1,'T',0);
delay_ms(3000);
USART_WriteBuffer(USART1,buf2,sizeof(buf2));
USART_WriteBuffer(USART1,buf4,sizeof(buf4));
lcd_pin (1,0,1,2,3,4,5);
i=0;
do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i)!=13 && i<10);
lcd_gotoxy(1,1);
lcd_clear();
lcd_putsf(havij);
delay_ms(200);
}
ولی کراراکتر اینتر رو متوجه نمیشه!!
یعنی تا 10 تا نشه رو ال سی دی چیزی نمی نویسه!
فکر می کنم کاراکتر اینتر را اشتباه گفتید!
باز هم ممنون!
نه دوست من شما کد رو اشتباه نوشتی !lov:
الان میگم اشتباه شما کجاست
این کدی که شما نوشتی :
do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i)!=13 && i<10);
برسی کد:
در لحظه اول که i=0 هست مقدار خوانده شده در خانه صفر از آرایه هویج قرار میگیرد و بلافاطصله یکی به مقدار i اضافه میشود و در سطر بعد که دستور While هست خانه 1 {چون در خط قبل یکی به مقدار i اضافه شده است } که هم اکنون مقدار دهی نشده است با مقدار 13 مقایسه میشود پس در نهایت همیشه مقدار 0 با 13 مقایسه میشه، امیدوارم متوجه اشتباه کد شده باشید و اما راه حل :
راه اول:{توصیه نمی کنم}
do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i-1)!=13 && i<10);
راه دوم:{استاندارد هست}
do
{
*(havij+i)=USART_Read(USART1,0);
}while(*(havij+i++)!=13 && i<10);
خیلی ممنون من خودم متوجه اشتباهم شدم و درستش کردم ولی الان یه مشکل دارم!
میشه دستور های زیر رو برام توضیح بدید:
1- چگونگی جدا کردن n کارکتر از سمت چپ یا راست رشته x
2-چگونگی ترکیب 2 رشته از سمت چپ یا راست
3- چگونگی اضافه کردن کاراکتر n به سمت چپ یا راست کراکتر x
همین
خیلی ممنون میشم توضیح بدید اشکال اصلی من توی زبان هست!
الان کمک دقیقا در چه زمینه باید باشه؟:018:
Powered by vBulletin® Version 4.2.1 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.