atmega fonctionnant avec driver FTDI mais pas avec driver ATMEL

Bonjour à tous !

je rencontre un vrai souci avec un sketch qui me permet de discuter avec mon logiciel whitecat en liaison serie, à 14 400, et de recevoir émettre des petits tableaux de données

le souci est le suivant:
sur platine UNO / GENUINO l'atmega recoit les données et fais ce qu on lui demande, mais n émet pas vers l ordi ( meme si la diode TX fonctionne): le tableau de données n arrive pas dans mon soft

le meme atmega, sur platine jeenode, ou en stand alone sur plaque de prototypage fonctionne comme voulu et désiré , via le driver FTDI (USB BUB ou cable FTDI)

j ai essayé plusieurs procédures, me suis posé des pbs de code (ce n etait pas ca), de drivers, pour finalement arriver au constat que la liaison série ne se fait pas correctement avec le driver atmega

le même atmega, posé d une platine à l autre fonctionne, ou PAS.

donc avant de rentrer dans du code etc... avez vous des suggestions ? (le tableau transmis en IN et en OUT fait de 26 à 100 bytes).

bonjour de fort de france et du stage arduino que nous donnons avec jacques

C'est clair : le problême ne vient pas du microtroleur principal (ATmega328p) mais de l'interface USB/UART (Atmega16U2).

Sur les UNO officiels il y a ce p**ain d'ATmega 16 U2 qui fait $#@$ : c'est toujours à cause de lui qu'on obtient
"avrdude not in sync".

  1. Vive les clones chinois avec le CH340G qui fonctionnent sans soucis (il y a juste un pilote à installer et encore que pour Windows, pour linux il n'y a rien à faire)
  2. Tu peux essayer de te renseigner sur comment reflasher l'atmega16U2.

oui enfin bon c est pas une solution de reflasher le hardware !

la librairie que j utilise pour discuter avec l arduino est CSerial avec quelques modifs. l acces au port com se fait donc par elle, sans appel spécifique à FTDI

environnement windows, compilé sous code blocks mingw32

// Serial.h

#ifndef SERIAL_H
#define SERIAL_H

#define FC_DTRDSR 0x01
#define FC_RTSCTS 0x02
#define FC_XONXOFF 0x04
#define ASCII_BEL 0x07
#define ASCII_BS 0x08
#define ASCII_LF 0x0A
#define ASCII_CR 0x0D
#define ASCII_XON 0x11
#define ASCII_XOFF 0x13

class CSerial
{

public:
CSerial();
~CSerial();

BOOL Open( int nPort = 2, int nBaud = 9600 );
BOOL Close( void );

int ReadData( void *, int );
int SendData( unsigned char *, int );//christoph 21/04/2015 > unsigned char instead of char or data sended in PWM is trunkened a half !
int ReadDataWaiting( void );
BOOL Flush(void);

BOOL IsOpened( void ){ return( m_bOpened ); }

protected:
BOOL WriteCommByte( unsigned char );

HANDLE m_hIDComDev;
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
BOOL m_bOpened;

};

#endif

// Serial.cpp

#include "Serial.h"

CSerial::CSerial()
{

memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_hIDComDev = NULL;
m_bOpened = FALSE;

}

CSerial::~CSerial()
{

Close();

}

BOOL CSerial::Flush( void )
{
if( m_OverlappedRead.hEvent != NULL ) FlushFileBuffers( m_OverlappedRead.hEvent );
return(0);
}

BOOL CSerial::Open( int nPort, int nBaud )
{

if( m_bOpened ) return( TRUE );

char szPort[15];
char szComParams[50];
DCB dcb;

wsprintf( szPort, "COM%d", nPort );
m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
if( m_hIDComDev == NULL ) return( FALSE );

memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts( m_hIDComDev, &CommTimeOuts );

wsprintf( szComParams, "COM%d:%d,n,8,1", nPort, nBaud );

m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

dcb.DCBlength = sizeof( DCB );
GetCommState( m_hIDComDev, &dcb );
dcb.BaudRate = nBaud;
dcb.ByteSize = 8;
unsigned char ucSet;
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
if( !SetCommState( m_hIDComDev, &dcb ) ||
!SetupComm( m_hIDComDev, 10000, 10000 ) ||
m_OverlappedRead.hEvent == NULL ||
m_OverlappedWrite.hEvent == NULL ){
//ne pas toucher
DWORD dwError = GetLastError();
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
return( FALSE );
}

m_bOpened = TRUE;

return( m_bOpened );

}

BOOL CSerial::Close( void )
{

if( !m_bOpened || m_hIDComDev == NULL ) return( TRUE );

if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
m_bOpened = FALSE;
m_hIDComDev = NULL;

return( TRUE );

}

BOOL CSerial::WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;

bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) ){
if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0;
else{
GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
m_OverlappedWrite.Offset += dwBytesWritten;
}
}

return( TRUE );

}

//christoph 21/04/2015 > unsigned char instead of char or data sended in PWM is trunkened a half !
int CSerial::SendData( unsigned char *buffer, int size )
{

if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

DWORD dwBytesWritten = 0;
int i;
for( i=0; i<size; i++ ){
WriteCommByte( buffer );

  • dwBytesWritten++;*
  • }*
  • return( (int) dwBytesWritten );*
    }
    int CSerial::ReadDataWaiting( void )
    {
  • if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );*
  • DWORD dwErrorFlags;*
  • COMSTAT ComStat;*
  • ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );*
  • return( (int) ComStat.cbInQue );*
    }
    int CSerial::ReadData( void *buffer, int limit )
    {
  • if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );*
  • BOOL bReadStatus;*
  • DWORD dwBytesRead, dwErrorFlags;*
  • COMSTAT ComStat;*
  • ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );*
  • if( !ComStat.cbInQue ) return( 0 );*
  • dwBytesRead = (DWORD) ComStat.cbInQue;*
  • if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;*
  • bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );*
  • if( !bReadStatus ){*
  • if( GetLastError() == ERROR_IO_PENDING ){*
  • WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );*
  • return( (int) dwBytesRead );*
  • }*
  • return( 0 );*
  • }*
  • return( (int) dwBytesRead );*
    }
    [/quote]

Deux remarques :

  1. Tu en es à ton 405 eme messages et tu ne met toujours pas le code entre balises code : tu cherches à faire de la provocation !

  2. Un pilote est transparent : c'est juste une interface pour que le PC communique avec le module chargé de la conversion USB/UART.
    Si c'est la conversion USB/UART qui est défaillante quel que soit le pilote cela ne fonctionnera pas mieux.
    Ce n'est pas une certitude mais c'est très fréquent que la conversion USB/UART à base d'atmega16U2 à des gros problèmes.

Merci mais il etait tard hier et il n y a pas de bouton code ou alors je n ai pas les yeux en face des trous.

Je cherche une solution constructive pas une regle sur les doigts.

Pour moi le pb vient du driver: ca fonctionnait en juillet 2015 quand j ai developpe une lib de communication , avec des arduino sous 16u. Le meme materiel avec le meme code ne fonctionne plus aijourd hui avec le meme code.
Tests faits sous seven et 10.

Y a t il une procedure pour faire remonter le pb ?

bonjour christoph
çà donne quoi si tu connecte un adaptateur serial/usb (FTDI ou autre) directement sur les pins RX/TX ( 0/1) de ton uno ?

au passage la balise code c'est le premier icone </>

Bonjour philippe!

Merci de ta reponse j essayerais de me souvenir de la balise pour le prochain post dans un an.

J ai fait l essai et etonnament ca ne fonctionne pas en se mettant sur tx rx de l uno (et gnd et vcc) en pontant depuis l usb bub.

karistouf:
Bonjour philippe!

Merci de ta reponse j essayerais de me souvenir de la balise pour le prochain post dans un an.

J ai fait l essai et etonnament ca ne fonctionne pas en se mettant sur tx rx de l uno (et gnd et vcc) en pontant depuis l usb bub.

salut christoph
tu a bien mis rx/rx et tx/tx ?
parce qe là on est dans une config "de substitution"

oui, voyant que ca ne marchait pas c est ce que j ai fait. en meme temps hier c etait la journée à pannes pour beaucoup de monde.

karistouf:
oui, voyant que ca ne marchait pas c est ce que j ai fait. en meme temps hier c etait la journée à pannes pour beaucoup de monde.

:grin:
En meme temps , là où tu es, si ça trouve il y a peut etre de l'influence vaudou sur les arduinos ! ;D ;D
"Tienbai raid, pa moli" ! 8)
bonjour à Jacques

Arf et tu parles pays :slight_smile: !!!