2013-06-15 4 views
3

J'écris une application console réelle qui interroge plusieurs ports série pour les données et enregistre les résultats dans une base de données.realbasic tester un port série pour savoir si elle est en vie

Mon idée initiale était d'ouvrir le port, de lire les données puis de le refermer. Le problème est que l'ouverture d'un port série peut prendre jusqu'à 4 secondes et que j'ai besoin de lire jusqu'à 8 ports, l'ouverture et la fermeture du port ne sont pas pratiques pour chaque cycle.

Il est très possible que le périphérique série soit déconnecté d'un port ouvert, ce qui peut causer des problèmes.

Donc, est-il possible de détecter si un port est ouvert et vivant afin que je puisse laisser le port ouvert et le fermer et le rouvrir seulement lorsque je détecte que le périphérique connecté est parti.

modifier

Le port série est un port série Bluetooth, il parle à une radio Bluetooth qui parle à son tour à un microcontrôleur. J'ai des caractères de début et de fin que j'écoute et tout fonctionne correctement, jusqu'à ce que l'appareil bluetooth soit hors de portée et se déconnecte effectivement en laissant le port série toujours ouvert.

Je peux bien sûr fermer le port et essayer de l'ouvrir à nouveau, mais je voudrais plutôt détecter si le périphérique est toujours connecté au port série bluetooth. En outre, appeler serial.close() sur un port série sur OSX provoque un blocage momentané (le curseur du bureau se fige), je suppose que 100% de l'utilisation du processeur, cela n'arrive pas sur Windows et je veux donc minimiser le Le port ouvre et ferme que je dois faire comme je suis l'interrogation des données d'environ 10 appareils bluetooth une fois par minute. Comme il faut jusqu'à 4 secondes pour ouvrir un port série, la meilleure solution serait d'utiliser une connexion HID directe à la radio Bluetooth au lieu d'une connexion série SPP, mais il semble que personne ne se soit jamais connecté à un port série. appareil HID bluetooth avant et donc il n'y a pas d'info ou d'aide à ce sujet.

+0

Pour quel système d'exploitation avez-vous besoin de cela? –

+0

Bonjour les plates-formes Thomas, Windows et OSX. La série est encore relativement lente, la meilleure solution serait de parler au périphérique bluetooth en tant que périphérique HID, mais il semble que personne n'ait jamais utilisé realbasic pour se connecter à un périphérique HID (non-usb) auparavant. – crankshaft

+0

Vous auriez besoin d'écrire un plugin RB pour installer un gestionnaire de périphérique d'espace utilisateur, ou un démon avec lequel vous parlez à partir de RB. De toute façon, vous ne serez pas en mesure de le faire dans RB pur. –

Répondre

1

Votre requête est un peu étrange car, en règle générale, vous vous connectez au port série, puis attendez de recevoir les données envoyées à ce port. En d'autres termes. Le port série ne stocke aucune donnée en attente de vous dégorger lorsque vous vous connectez. Vous écoutez ou non.

Vous devez vous connecter au port et écouter les données. Une fois que vous recevez des événements DataAvailable, vous pouvez commencer à traiter les données, mais sachez que toutes les données du flux n'ont peut-être pas été reçues et traitées avant que l'événement ne se produise. Vous devez généralement déterminer la fin du message. Parfois, il s'agit d'un retour Carraige et parfois non. Cela dépend du système.

Plus d'informations sur DataAvailable à http://docs.xojo.com/index.php/Serial.DataAvailable

1

Cela fait quelques années que je l'ai fait la programmation série dans RB, donc je ne me rappelle pas tout.

La classe Serial a un événement "LineStateChanged". Avez-vous vérifié si cela est appelé une fois que le conn BT est perdu ou reconnecté?

Si cela ne fonctionne pas, vous pouvez essayer d'utiliser les fonctions BSD/POSIX de bas niveau pour ouvrir le port et utiliser les appels ioctl() pour déterminer son état. Je n'ai pas d'exemples pour ça, cependant. Et je ne suis même pas sûr que ce soit la bonne façon de le faire. Cela revient probablement à apprendre ce que ferait un programme C et à traduire cela en RB.A propos de la mauvaise performance: Cela est généralement dû au contrôle limité de RB sur sa gestion des événements: Il ne voit pas qu'il a besoin d'interroger le port série plus souvent, et ne le vérifie donc que rarement tant qu'il n'a pas d'autres raisons pour demander plus de temps d'inactivité de l'OS. L'astuce consiste à exécuter un minuteur avec une fréquence élevée (par exemple toutes les 10 ms), puis à appeler la fonction Poll du port série à partir de l'événement Action du minuteur.