Aide - Recherche - Membres - Calendrier
Version complète : SOS Send serial Data
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
capitain
Salut a tous ,
depuis plusieur semaine , je developpe un logiciel qui me permettra d'envoyer des date par Bluetooth de mon PDA a un apareil.
toutes les etapes fonctionnent sans pb :
ouvrir un Port: err=SrmExtOpen() OK
etablir une liaison entre les 2 apareil OK
mais quand j'envoye un message :SrmSend(unPortId,msg,tosend,&err);
le message n'est pas envoyer mais aucune erreur n'est signaler.
j'attend impatiament vos aides.

Capitain
olivier101
Peut-être qu'un morceau de code nous aiderait plus à comprendre...
capitain
Salut Olivier101
Merci d'avoir vit reagit à mon message
Voici mon Code complet j'avoue que je l'ai pris d'un Example sur le Net:

CODE
/******************************************************************************
*
* Copyright © 1999-2004 PalmSource, Inc. All rights reserved.
*
* File: AppMain.c
*
*****************************************************************************/

#include <PalmOS.h>
#include "BtCommVdrv.h"
#include "BT_SRC.h"


/***********************************************************************
*
*    Entry Points
*
***********************************************************************/


/***********************************************************************
*
*    Internal Constants
*
***********************************************************************/
#define appFileCreator      'STRT'    // register your own at [url=http://www.palmos.com/dev/creatorid/]http://www.palmos.com/dev/creatorid/[/url]
#define appVersionNum      0x01
#define appPrefID    0x00
#define appPrefVersionNum  0x01

#define AppCreator          '???2'     //TODO set your Application Creator ID
#define sysFileTApplication 'appl'
#define MinVersion          0x05000000 //TODO set your minimal version number here (this is 5.0)
typedef struct {
//TODO declare here your preference variables
UInt8  cAddress[1];

} Prefs;
static Prefs   prefs;


/* BT Globals */
/**************/
static UInt16 unPortId;
static UInt16 btLibRefNum;
static Err err;
static SrmOpenConfigType config;
static BtVdOpenParams    btParams;
static BtLibSdpUuidType  sppUuid;
/***********************************************************************
*
*    Internal Functions
*
***********************************************************************/
/**************************************/
/* Close a Bluetooth serial connetion */
/**************************************/
static void BT_Close()
{
if(unPortId)
 {
  WinDrawChars("Close     ",10,80,0);
  SrmClose(unPortId);
  unPortId=0;
 }
}

/*************************************/
/* Open a Bluetooth serial connetion */
/*************************************/
static void BT_Open()
{
 BT_Close();

 MemSet(&sppUuid, sizeof(sppUuid), 0);
 sppUuid.size = btLibUuidSize16;
 sppUuid.UUID[0] = 0x11;
 sppUuid.UUID[1] = 0x01;
 MemSet(&btParams, sizeof(btParams), 0);
 btParams.u.client.remoteDevAddr.address[0]=prefs.cAddress[0];
 btParams.u.client.remoteDevAddr.address[1]=prefs.cAddress[1];
 btParams.u.client.remoteDevAddr.address[2]=prefs.cAddress[2];
 btParams.u.client.remoteDevAddr.address[3]=prefs.cAddress[3];
 btParams.u.client.remoteDevAddr.address[4]=prefs.cAddress[4];
 btParams.u.client.remoteDevAddr.address[5]=prefs.cAddress[5];
 
 btParams.role = btVdClient;
 btParams.u.client.method = btVdUseUuidList;
 btParams.u.client.u.uuidList.tab = &sppUuid;
 btParams.u.client.u.uuidList.len = 1;
 MemSet(&config, sizeof(config), 0);
 config.function = serFncUndefined;
 config.drvrDataP = (MemPtr)&btParams;
 config.drvrDataSize = sizeof(btParams);

 err=SrmExtOpen(sysFileCVirtRfComm,//Type of Port==Bluetooth RFComm
                 &config,//Port configuration Params
                 sizeof(config),//Laege von port Params
                 &unPortId//Emfang von ID von diesem port instance
                );
 
 if(err==0)
  WinDrawChars("Open      ",10,80,0);
 
 else
  WinDrawChars("Error1    ",10,80,0);
}

static void BT_FindDevice()
{
BT_Close();

if(btLibRefNum)
 {
  err=BtLibOpen(btLibRefNum,false);
  if(err==0)
   {
    err=BtLibDiscoverSingleDevice(btLibRefNum,NULL,NULL,0,
            (BtLibDeviceAddressType *)(prefs.cAddress),false,true);
    if(err)
     WinDrawChars("Error2    ",10,80,0);
    else
     WinDrawChars("Found     ",10,80,0);
   
   }
  BtLibClose(btLibRefNum);
 }
}
/***********************/
/* Load the BT library */
/***********************/
static void BT_LoadLibrary()
{
btLibRefNum=0;

err=SysLibFind("Bluetooth Library",&btLibRefNum);

if(err)
 err=SysLibLoad(sysFileTLibrary,sysFileCBtLib,&btLibRefNum);

if(err)
 WinDrawChars("Error3    ",10,80,0);
}
/****************/
/* Flush BT ser */
/****************/
static void BT_Flush(UInt16 unTimeout)
{
if(unPortId)
 {
  err=SrmReceiveFlush(unPortId,unTimeout);
  if(err)
   WinDrawChars("Error4    ",10,80,0);
 }
}


/****************/
/* Send BT data */
/****************/
static void BT_Send()
{
    UInt32 tosend,Nachricht;
    char msg[10];
5r7t
    msg[0]=0x43;
    msg[1]=0x06;
    msg[2]=0x00;
    msg[3]=0x01;
    msg[4]=0x00;
    msg[5]=0x52;
    msg[6]=0xFF;
    msg[7]=0xFF;
    msg[8]=0x17;
    msg[9]=0x0D;
    tosend =sizeof(msg);
if(unPortId)
 {
 
  Nachricht=SrmSend(unPortId,msg,tosend,&err);
  if(err)
   WinDrawChars("Error5    ",10,80,0);
  else
   WinDrawChars("Okay5     ",10,80,0);
 }
 
}

/*************************************************/
/* You may need to preprocess events, do it here */
/*************************************************/
Boolean PreprocessEvent(EventPtr eventP)
{
Boolean handled = false;
WChar   chrPress;

chrPress=eventP->data.keyDown.chr;

switch(eventP->eType)
 {
  case keyDownEvent:
   switch(chrPress) //TODO you may wish to handle key events...
    {
     case vchrHard1:// button 1
      BT_FindDevice();
      BT_Open();
      BT_Flush(5000);
      handled=true;
      break;
     case vchrHard2:// button 2
      BT_Send();
      handled=true;
      break;
   
     case vchrHard4:// button 4
      BT_Close();
      handled=true;
      break;
     default:
      break;
    }
   break;
  default:
   break;
 }

return handled;
}

/***********************************************************************
*
* FUNCTION:    MainFormHandleEvent
*
* DESCRIPTION: This routine is the event handler for the
*              "MainForm" of this application.
*
* PARAMETERS:  pEvent  - a pointer to an EventType structure
*
* RETURNED:    true if the event has handle and should not be passed
*              to a higher level handler.
*
* REVISION HISTORY:
*
*
***********************************************************************/

static Boolean MainFormHandleEvent(EventPtr eventP)
{
Boolean handled = false;
FormPtr frmP = FrmGetActiveForm();
UInt16 unFrmID;

switch(eventP->eType)
 {
  case frmOpenEvent:// open a form
   FrmDrawForm(frmP);
   unFrmID=FrmGetActiveFormID();
   if(unFrmID==MainForm)// it's the main form
    {
    }
   handled = true;
   break;
 // case menuEvent:
   //handled=doMenu(frmP, eventP->data.menu.itemID);
  // break;
  case ctlSelectEvent:
   switch (eventP->data.ctlSelect.controlID)
    {
     case FIND_BUTT:
      BT_FindDevice();
      handled = true;
      break;
     case CONN_BUTT:
      BT_Open();
      BT_Flush(2000);
      handled = true;
      break;
     case SEND_BUTT:
      BT_Send();
      handled = true;
      break;
     
     case CLOSE_BUTT:
      BT_Close();
      handled = true;
      break;
     default:
      break;
    }
   break;
  default:
   break;
 }
return handled;
}
/***********************************************************************
*
* FUNCTION:    AppHandleEvent
*
* DESCRIPTION: This routine loads form resources and set the event
*              handler for the form loaded.
*
* PARAMETERS:  event  - a pointer to an EventType structure
*
* RETURNED:    true if the event has handle and should not be passed
*              to a higher level handler.
*
* REVISION HISTORY:
*
*
***********************************************************************/
static Boolean AppHandleEvent(EventType* pEvent)
{
    UInt16      formId;
    FormType*  pForm;
    Boolean  handled = false;

    if (pEvent->eType == frmLoadEvent) {
 // Load the form resource.
 formId = pEvent->data.frmLoad.formID;
 
 pForm = FrmInitForm(formId);
 FrmSetActiveForm(pForm);

 // Set the event handler for the form.  The handler of the currently
 // active form is called by FrmHandleEvent each time is receives an
 // event.
 switch (formId) {
     case MainForm:
   FrmSetEventHandler(pForm, MainFormHandleEvent);
   break;

     default:
   break;
 }
 handled = true;
    }
    
    return handled;
}


/***********************************************************************
*
* FUNCTION:     AppStart
*
* DESCRIPTION:  Get the current application's preferences.
*
* PARAMETERS:   nothing
*
* RETURNED:     Err value errNone if nothing went wrong
*
* REVISION HISTORY:
*
*
***********************************************************************/
static Err AppStart(void)
{
UInt16 prefSize = sizeof(Prefs);
    FrmGotoForm(MainForm);
    

//Load application preferences
    if((PrefGetAppPreferences(AppCreator,0,&prefs,
            &prefSize,true)==noPreferenceFound)
     ||(prefSize != sizeof(prefs)))
 {
  //TODO set default preference values here
  prefs.cAddress[0]=0;
  prefs.cAddress[1]=0;
  prefs.cAddress[2]=0;
  prefs.cAddress[3]=0;
  prefs.cAddress[4]=0;
  prefs.cAddress[5]=0;
 
  PrefSetAppPreferences(appFileCreator,0,1,&prefs,sizeof(Prefs),true);
 }

unPortId = 0;
btLibRefNum = 0;
BT_LoadLibrary();
    return errNone;
}


/***********************************************************************
*
* FUNCTION:    AppStop
*
* DESCRIPTION: Save the current state of the application.
*
* PARAMETERS:  nothing
*
* RETURNED:    nothing
*
* REVISION HISTORY:
*
*
***********************************************************************/
static void AppStop(void)
{
    // Close all the open forms.
    FrmCloseAllForms();
}


/***********************************************************************
*
* FUNCTION:    AppEventLoop
*
* DESCRIPTION: This routine is the event loop for the application.  
*
* PARAMETERS:  nothing
*
* RETURNED:    nothing
*
* REVISION HISTORY:
*
*
***********************************************************************/
static void AppEventLoop(void)
{
    Err      error;
    EventType    event;

    do {
 EvtGetEvent(&event, evtWaitForever);

 if (SysHandleEvent(&event))
     continue;
     
 if (MenuHandleEvent(0, &event, &error))
     continue;
     
 if (AppHandleEvent(&event))
     continue;

 FrmDispatchEvent(&event);

    } while (event.eType != appStopEvent);
}


/***********************************************************************
*
* FUNCTION:    PilotMain
*
* DESCRIPTION: This is the main entry point for the application.
*
* PARAMETERS:  cmd - word value specifying the launch code.
*              cmdPB - pointer to a structure that is associated with the launch code.
*              launchFlags -  word value providing extra information about the launch.
* RETURNED:    Result of launch
*
* REVISION HISTORY:
*
*
***********************************************************************/
UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
    Err error = errNone;

    switch (cmd) {
 case sysAppLaunchCmdNormalLaunch:
     if ((error = AppStart()) == 0) {      
   AppEventLoop();
   AppStop();
     }
     break;

 default:
     break;
    }
    
    return error;
}
Patrice
Qu'est-ce qui te fait dire que le "message" n'est pas envoyé ? Si c'est par ce que tu ne le reçois pas, es-tu certain du fonctionnement du récepteur ?
capitain
en fait je recois le message OK qui me confirme que le message à été envoyer mais l'apareil vers lequel j'ennvoye le message ne me signale aucun acuser de reception ou une faute.
j'ai essayer d'envoyer un simple texte vers mon PC,j'etablit la liason mais rien arrive.
CODE
if(unPortId)//  est ce que ici unPortId ca nedevra pas etre de Type boolean
{

Nachricht=SrmSend(unPortId,msg,tosend,&err);
olivier101
Tu utilises quoi sur le PC pour la connexion ?
capitain
J'utilise un Bluetooth USB- Adapter(3Com)
Patrice
La question portait plutôt sur le logiciel icon_exclaim.gif
Patrice
A noter un bug assez sévère dans ton code, qui ne doit pas aider au bon fonctionnement : la structure Prefs est déclarée en UInt8[1] et pourtant tu l'utilises comme un UInt8[6]...
capitain
Palm Os Dev-Suite( ECLIPSE) INSTALLER SUR WINDOWS
Patrice
:rolleyes2: Ce qui serait intéressant de savoir, c'est surtout avec quoi tu essaies de recevoir les données transmises... Parce que si tu nous expliques aussi que tu utilises FireFox ou OpenOffice, ça n'aidera pas énormément...
capitain
3com posede une boite de reception où les dates transmises se retrouvent.
Quand j'envoye par exemple une foto de mon PDA via Bluetooth à mon PC je recois une confirmation de transfer et la foto se trouve dans la boite de reception.
mais par mon programme je ne recois ne ce reste que cette confirmation de transmission . je suis vraiment à bout de nerf . meme le Prof. qui suit mes recherches n'arrive pas à m'aider.
en effet je doit envoyer des commande à un Moteur (CAN-Bus) Via Bluetooth de mon PDA. la premiere partie consistais à monter ce moteur et le controler à partir du SW du Frabriquant. Chose qui a éte fait avec succès.
Patrice
Si tu transmets par le port série, la réception se fait sur le port série de l'interface BT et il est certain que tu ne vas pas recevoir une notification dans ce cas...

Et tu risques encore moins de recevoir quoi que ce soit sur le PC si tu ne branches pas un soft sur le port série :rolleyes2:
capitain
Donc ca veut dire que le port par lequel j'envoye mon message est occuper par la connection.
Peus tu me donner un Tip( une idée ) comment est ce que je peus ameliorer mon Soft?
et si au lieu de UNport je met le numero de serie de l'appareil vers lequel je veus envoyer mes données

CODE
if(unPortId)//  est ce que ici unPortId ca nedevra pas etre de Type boolean
{

Nachricht=SrmSend(btLibRefNum,msg,tosend,&err);// Ici
Patrice
Désolé mais je ne comprend plus rien à ce que tu écris.

Je ne peux que ré-écrire :
1) Tu as un bug dans ton code que tu pourrais commencer par corriger
2) Pour moi, l'envoi fonctionne et je n'ai encore rien vu qui prouve le contraire
capitain
quel Bug il me faut corriger?
penses tu que c'est le message que j'envoye qui n'est pas OK?
Normalement ce CAN _Bus Apareil est relier à un Moniteur qui rapport tous les Infos , Normalement si le Messages n'etait pas correct c'a allais transmettre une erreur sur l'ecran.
L'ecran me raporte que le PDA veut ce connecter(Button Open_Conn) avec le CAN-Bus,
Il confirme aussi que la Liaison est etablit apres l'appuis sur le Button Connect
mais quand j'appuis sur Send_DATA il n'y a aucun rapport qui s'affiche bien que je recois un OK du PDA
Patrice
CITATION(capitain)
quel Bug il me faut corriger?

Si tu lisais les réponses que j'ai écrites ci-dessus icon_question.gif rolleyes.gif
capitain
Sorry je ne l'avais pas vu,
je doivrai donc le declare en UInt8[6]? ou le laisser en UInt8[1]
et utiliser comme un UInt8[1]
capitain
quelqu'un aurais un petit code complet qui fonctionne dans lequel un Message x quelconque est envoyer vers un Apareil BTb avec srmsend()?
Trudi
D'ailleurs pour tes tests, tu devrais pouvoir connecter un hyper-terminal sur le port série bluetooth et comme ça tu recevras à l'écran toutes les chaînes de caractère qui arrivent sur le port série bluetooth...

Une fois que tu auras validé que ce que tu reçois est bien correct, tu pourras brancher ton soft de monitoring de ton moteur !
capitain
Ca je l'ai deja fait et je connais les caracteres qui son à envoyer j'ai essayer sans succès .je crois que mon Pb se situe au niveau de l'envoye des données
srmsend():
Est ce que tous mes parametres sont ok!
Patrice
CITATION(capitain)
quelqu'un aurais un petit code complet qui fonctionne dans lequel un Message x quelconque est envoyer  vers un Apareil BTb avec srmsend()?

Visiblement tu as déjà pompé un sample de PalmSource, qui doit fonctionner. Qu'est-ce qu'un autre exemple pourrait t'apporter de plus ? Si ton problème est que tu ne sais pas programmer, il vaut mieux commencer par apprendre (mais je ne voudrais pas paraître désagréable icon_redface.gif ) :wink2:
capitain
c'est vrai que la programation n'est pas mon Fort .
c'est juste pour me rasurer que la methode srmsend() transmet effectivement des dates. je suis dans mes debut sur le Palm et son premier Programme.
Patrice
Et bien je peux te confirmer qu'en dehors du bug déjà signalé, je ne vois pas de raison pour que ça ne fonctionne pas. D'où mes remarques sur ta méthode pour décider que rien n'était envoyé. Et comme l'a suggéré Trudi, tu devrais essayer la réception avec Hyper Terminal pour t'assurer qu'il n'arrive rien.
capitain
Merci, une fois arrive demain au Labor je vais reverifier avec l'Hyper Terminal
capitain
J'ai essayé avec un Hyper Terminal mais il ne recoit rien sur l'ecran, pas de message, pas d'erreur
Trudi
Ca doit donc être que ton programme n'envoir rien... As-tu corrigé le bug mentionné par Patrice ?

Et qu'as-tu mis comme vitesse dans l'Hyperterminal ? En principe 9600 bauds sont suffisants et ensuite Xon/Xoff pour le contrôle de flux et parité : aucune, si mes souvenirs sont bons.
olivier101
Je signale que c'est une connexion BT donc il faut sélectionner dans HyperTerminal le port série virtuel correspondant au profil BT série.
Patrice
Le port série "local" (et non "client") wink.gif
capitain
Ok et une fois que le BT lokal port est choisit je dois envoyer un message de mon PDA vers mon Hyper Terminal?
capitain
Salut a tous je reviens avec mon PB que je n'ai pas pu regler,
j'ai essayer avec un Hyper terminal , les date ne sont pas transmises.
Avec un simple code:

CODE
BT_Send()
{
    UInt32 tosend;
    char msg[]="Hallo leo";
    tosend = sizeof(msg);
    
if(unPortId)
 {
 SrmSend(unPortId,msg,tosend,&err);

 
  if(err)
   WinDrawChars("Error5    ",10,80,0);
  else
 
  WinDrawChars("Okay5     ",10,80,0);
   
 
}

quelqu'un peut me dir ou est ma faute
olivier101
Lorsque tu exécutes ce code, tu as Error5 ou Okay5 ?
Lorsque tu lances le programme, il te propose bien de choisir l'appareil BT à contacter ? Tu choisis bien le PC ?
Sur le PC, tu as bien un port COM associé au profil série de l'interface BT? Ton HyperTerminal est bien connecté sur ce même port COM ?
capitain
Lorsque j'execude le code je recois un OK,
Toute les phases anterieur fonctionnent sans PB. La connection est là avec l'hyper Terminal.
ca me rend deja fou :ph34r: :ph34r: :ph34r: :ph34r:
Patrice
Si le résultat du send est OK, c'est que les données sont parties (certain à 99%). Si tu ne les vois pas arriver c'est que tu te débrouilles mal côté réception.

Il n'y a vraiment rien de sorcier à envoyer quelques octets sur le port BT du Palm wink.gif

Sauf que dans ton dernier extrait de code, il y a encore un bug énorme : un sizeof(msg) renvoie la taille d'un pointeur (soit 4), je doute que ce soit ce que tu souhaites.
capitain
Ca veut dire que pour mon bug je devrai utiliser strlen(smg). :excl:
Mon programm est sur mon PDA ,je voudrai envoyer mon Message " Hello Leo "sur mon vers mon PC ou un autre appareil :excl:
olivier101
CITATION(capitain @ 18/06/2005 à 22:48 )
Ca veut dire que pour mon bug je devrai utiliser strlen(smg). :excl:
*

Evidemment...

Sinon tu n'as pas répondu à mes autres questions, ça n'est pas facile de t'aider.
Did
Je sais que c'est totalement hors-sujet, mais je pense que la remarque de Patrice et Olivier sur l'utilisation de strlen plutot que sizeof est en fait fausse.

En C, un pointeur et un tableau ne sont pas strictement equivalent. La difference se manifeste en particulier lorsque l'operateur sizeof est utilise. C'est un des pieges classiques du C.

Donc, quand on ecrit:

CODE
char msg[]="Hallo leo";
tosend = sizeof(msg);


... on obtient bien 10 dans tosend car msg est un tableau, et il est traite comme tel par le compilo.

Un idiome bien connu du C est d'ailleurs d'utiliser la macro suivante pour calculer le nombre d'element dans un tableau (compile time):

CODE
#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))


Par contre, si on avait:

CODE
char msg[]="Hallo leo";
void toto( char msg[] )
{
...
tosend = sizeof(msg);
}


... on obtiendrait bien 4 sur une plateforme 32 bits, ainsi que le disait Patrice, car le compilo considere que le tableau est en fait un pointeur (a juste titre).

Bien sur avec strlen ca marche aussi, et on n'a pas besoin de se poser la question. La difference c'est que la taille de la chaine sera evaluee au runtime.

Bon voila, desole, c'etait juste une precision a 2 balles.
A+
Patrice
C'est juste icon_redface.gif

A un petit détail près : sizeof() renvoie la taille du tableau, incluant donc le 0 terminal dans le cas d'une chaîne de caractère... (d'où le 10 au lieu de 9).
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.