7
votes

Comm.

//#include "StdAfx.h"
#include <stdio.h> 
#include <windows.h> 
#include <winbase.h>
#include <iostream>
#include <tchar.h>
using namespace std;

int main()
{

    int com = 'COM2';
    string data = "\n 010400 \n";
    char output[32];
    //unsigned int length = 0;
    DCB config = {0};
    bool abContinue = true;
    DWORD dwBytesWritten;
    DWORD  dwBytesRead;
    int isRead = false;

    HANDLE m_hCommPort = ::CreateFile(L"COM2",
        GENERIC_READ|GENERIC_WRITE,//access ( read and write)

        0,    //(share) 0:cannot share the COM port                        

        0,    //security  (None)                

        OPEN_EXISTING,// creation : open_existing

        0,    // we dont want overlapped operation

        0// no templates file for COM port...

        );

    config.DCBlength = sizeof(config);


    if((GetCommState(m_hCommPort, &config) == 0))
    {
        printf("Get configuration port has a problem.");
        return FALSE;
    }

    config.BaudRate = 9600;
    config.StopBits = ONESTOPBIT;
    config.Parity = PARITY_NONE; 
    config.ByteSize = DATABITS_8;
    config.fDtrControl = 0;
    config.fRtsControl = 0;

    if (!SetCommState(m_hCommPort, &config))
    {

        printf( "Failed to Set Comm State Reason: %d\n",GetLastError());
        //return E_FAIL;
    }

    printf("Current Settings\n Baud Rate %d\n Parity %d\n Byte Size %d\n Stop Bits %d", config.BaudRate, 
        config.Parity, config.ByteSize, config.StopBits);

    int isWritten = WriteFile(m_hCommPort, &data,(DWORD) sizeof(data), &dwBytesWritten, NULL);


    //memset(output, 0, sizeof(output));
    while (abContinue) 
    {

        isRead = ReadFile(m_hCommPort, output, sizeof(output), &dwBytesRead, NULL);

        if(!isRead)
        {
            abContinue = false;
            break;
        }

    }

    cin.get();
}
I am having trouble reading from the com port. If I step through the code, it goes into "isRead = ReadFile(m_hCommPort, output, sizeof(output), &dwBytesRead, NULL);" and doesn't come back out.... This is my first try at this with no success.

1 commentaires

Mon problème est le contraire exact. ReadFile n'attend que tout ce qui vient de retourner avec 0 octets Lecture et retour Valeur True -.-


4 Réponses :


2
votes

Si vous ne définit explicitement les délais d'attente , puis Readfile bloquera indéfiniment jusqu'à ce que les données soient disponibles.


0 commentaires

1
votes

La fonction READFILE peut bloquer votre fil, le cas échéant, il restera bloqué jusqu'à ce que certaines données puissent être lues à partir du port série. Voici un lien Voir si son aide. Bonne chance.


0 commentaires

13
votes

Vous pouvez essayer du code comme celui-ci après avoir ouvert le fichier, mais avant d'essayer de l'utiliser: xxx

éditer: peut-être qu'il est plus facile de commencer avec un code qui fonctionne et faites-le faire ce que vous voulez plutôt que d'essayer de faire fonctionner votre code. Voici un programme terminal simple. C'est minimaliste à l'extrême, mais travaille (au moins bien assez bien pour me laisser voir la sortie de mon GPS, pour un exemple). C'est une longue façon de savoir ce que quelqu'un (moins de moi) appellerait sophistiqué, mais devrait donner au moins une idée de la façon de commencer. xxx


3 commentaires

Ok, cela semble résoudre le problème du thread, mais je ne peux pas sembler obtenir le fichier ReadFile () pour remplir mon réseau de sortie.


Je devrais clarifier, je tente de communiquer avec un système intégré via Serial et son protocole de demande / réponse est basé sur des chaînes. Je travaille sur HyperTerminal mais je tente de créer mon propre code qui fait essentiellement la même chose.


Ok, j'ai parcouru votre code plus soigneusement. Cela aide vraiment, merci!



1
votes

J'ai eu ce problème sur un répertoire, avec les délais d'attente. Cela me faisait me conduire des craquelins, donc j'ai fini par avoir du code sur le Web qui a fonctionné, puis changeant la ligne par ligne pour voir où l'erreur était.

s'avère que Listerfile était bien. Mon problème était un watintcomment qui était suspendu lorsque le port était déconnecté car aucun événement COM n'est jamais reçu ...


0 commentaires