Je développe une application qui lit les données d'un port série et l'envoie via une connexion TCP, et vice versa. Malheureusement, lors de la lecture des données du port série, il ne s'arrête jamais. Il ne détecte pas la marque EOF, ni EOL ou un autre caractère spécial. Alors, comment ai-je pu détecter une fin de fichier (ou "fin de connexion") sur un port série en C et Linux?Envoyer un fichier sur un port série avec Linux et C
Répondre
Dépend de la quantité de contrôle que vous avez sur le protocole utilisé pour la liaison série. À moins que les fichiers n'incluent implicitement un marqueur de fin de fichier (et comme je l'ai compris, ils ne le sont pas), vous devez implémenter un certain type de protocole de communication afin de transférer des fichiers.
Certains des procols les plus simples utilisés dans les jours BBS étaient XMODEM et ses dérivés. Ils peuvent être assez simples pour vous d'utiliser.
Si vous avez un ordinateur complet à l'autre extrémité de la ligne série, il serait probablement beaucoup plus simple de configurer une liaison PPP sur la ligne série et de faire la communication via TCP/IP.
Vérifiez votre configuration du port série:
stty -F /dev/ttySx -a
Set lien cuit au lieu de lien cru:
stty -F /dev/ttySx cooked
liaison série envoie uniquement octets. Il n'y a pas de trame de paquet, pas de vérification d'erreur, donc vous ne pouvez pas envoyer des fichiers de manière fiable sur un lien série brut. Vous devez utiliser un protocole tel que XMODEM, KERMIT, etc.
Il n'est pas trivial d'implémenter un tel protocole. Il peut être plus facile d'exécuter TCP/IP sur le lien si l'autre extrémité est également un ordinateur. S'il vous plaît vérifier SLIP ou PPP.
Le port série indique "fin de fichier" en condition de blocage, qui est signalé hors bande par les lignes de commande du modem (abandon de DCD
). Si vous êtes connecté avec un null-modem, cela n'arrivera jamais.
Utilisez un mécanisme d'encadrement, comme les autres réponses l'ont suggéré. Vous n'aurez peut-être pas besoin de tout faire avec quelque chose comme ZMODEM - juste préfixer votre fichier avec la taille du fichier et une somme de contrôle CRC32 devrait faire, si le lien est raisonnablement sans erreur et 8 bits propre.
solution pas cher et sale: sur linux, unix ou osx il suffit d'exécuter 'écran -L <serial_device> <baudrate>. À l'autre extrémité, écrivez la sortie de votre fichier sur la console, en mode brut. -L le consigne dans un fichier dont le contenu sera le fichier que vous avez transféré de l'autre extrémité. Vérifiez le contenu avec xxd pour vérifier qu'ils correspondent à ce que vous aviez à la source.
Combien de contrôle avez-vous sur l'appareil connecté au port série? Qu'en est-il de l'appareil à l'autre bout du socket TCP? –
Comment décidez-vous quand écrire des données sur le socket TCP? C'est-à-dire, essayez-vous de recevoir l'ensemble des données avant de les transmettre via le socket, ou lisez-vous les données du socket et immédiatement (ou légèrement tamponné) en les écrivant sur le socket? –