Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

  • 3 tygodnie później...

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?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...