Skocz do zawartości

Atmega16 i RS232 - problem z komunikacją programem w C++/WinAPI


lukiradom

Pomocna odpowiedź

Witam, przez kilka ostatnich dni próbuję rozgryźć cały ten port COM, udało mi się "dogadać" z Atmegą16, jednak tylko przez terminal (dokładnie przez SimpleTerm, HyperTerminal oraz przez terminal BASCOM-AVR). Wszystko fajnie działa, jednak gdy przychodzi mi napisać program w czymkolwiek, czy to WinAPI+C, WinAPI+C++, C#, Delphi, to za nic w świecie nie chce działać. Dlatego myślę, że elektronika jest ok, skoro można przesyłać dane, dlatego poniżej zamieszczam swoje kody i jeśli będzie taka potrzeba, zrobię ładny schemat i zamieszczę zdjęcia mojej płytki. Streszczając, komunikuję się tak:

PC=>Konwerter USB->RS232=>MAX232=>Atmega16

Konwerter na układzie Prolific PL-2303.

Co do samej płytki, to zawiera ona dodatkowo 3 mostki L293D, cały układ tymczasowo zasilany z USB, testowany na 1 silniku DC. Atmega chodzi na wewnętrznym kwarcu.

Kod BASCOM:

$regfile = "m16def.dat"
$crystal = 1000000


$baud = 2400


Config Porta = Output


Config Com1 = 2400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0


Echo Off

Dim Polecenie As String * 12
Dim A As Byte

Do

Input Polecenie

If Polecenie = "uruchom" Then

     Porta.2 = 1

     Porta.0 = 1
End If

Waitms 5
Loop

Kod C++

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

static DCB dcb;
static HANDLE hNumPort;
static char lpBuffor_read[33], lpBuffor_write[33];
static DWORD RS_ile;
string pol;

int main(int argc, char *argv[])
{

hNumPort = CreateFile("COM6", GENERIC_WRITE |
GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, NULL);


dcb.DCBlength = sizeof(dcb);

dcb.BaudRate = CBR_2400;
dcb.fParity = TRUE;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;

dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;

dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDsrSensitivity = FALSE;
dcb.fAbortOnError = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;

if(SetCommState(hNumPort, &dcb)){
    cout << "Udalo sie \n";                          
} else {
    cout << "NIE udalo sie \n";         
}


strcpy(lpBuffor_write, "uruchom");// Niech to będzie przykładowe polecenie dla urządzenia

WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0);



//cout << ReadFile(hNumPort, lpBuffor_read, 8, &RS_ile, 0);


CloseHandle(hNumPort);      


   system("PAUSE");
   return EXIT_SUCCESS;
}

Dodam jeszcze, że terminal 232Analyzer nie chce współpracować. Może to coś z buferowaniem? Z może z jego brakiem po stronie AVR?

Z góry dziękuję za ewentualną pomoc, będę wdzięczny.

Link do komentarza
Share on other sites

Witam...

Nie jest to na razie rozwiązanie problemu ale nie rozumiem tego:

PC=>Konwerter USB->RS232=>MAX232=>Atmega16

masz konwerter USB na COM a potem COM przez MAX232 do atmegi? Toż to bez sensu trochę jest. Jest przecież FTDI232 i nic więcej nie potrzeba.

W Bascomie odczyt lepiej zrobić na przerwaniu i/albo Bytematch bo Input czeka na odbiór i nic w tym czasie nie zrobisz.

Do C/C++ jakie masz IDE?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.