Member 14837073 Ответов: 2

Как отправить данные в порт RS232 hexa decimal(запись) и получить в hexa decimal и печать в виде значения ASCII


(Это похоже на мониторинг последовательного порта)

Как я работаю на Порту Rs232 ,который я должен сделать мониторинг в текстовой области ,

у меня есть editbox (имя переменной "rs_hex_data_send"), где я должен отправить данные в шестнадцатеричном формате , после чтения n запись будет иметь шестнадцатеричное значение, но при печати в textraea(имя переменной "m_textareacom1") оно должно быть в ASCII-значении

проблемы 1: Как я могу взять данные editbox( имя переменной "rs_hex_data_send"), где я пишу и читаю

проблемы 2: как напечатать данные в текстовой области ASCII value i( имя переменной "m_textareacom1")

Код , который я пишу, является жестким кодом при объявлении значения hexdeciamla, но я хочу, чтобы из editbox отправлялись шестнадцатеричные десятичные данные

Что я уже пробовал:

BOOL Serialmonitoring::OpenPort(CString portname)
{
    portname = portname;

    hComm = CreateFile(portname,
        GENERIC_READ | GENERIC_WRITE,
        0, \
        0,
        OPEN_EXISTING,
        0,
        0);
    if (hComm == INVALID_HANDLE_VALUE) {
        AfxMessageBox(L"Cannot open Communication Port.Please\nQuit the program and Re-start your PC.", MB_OK + MB_ICONERROR);
        printf("\n    Port %s Opened\n ", portname);
        return false;
    }
    else
        return true;

}

BOOL Serialmonitoring::ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE Parity, BYTE StopBits)
{
    if ((m_bPortReady = GetCommState(hComm, &m_dcb)) == 0) {
        AfxMessageBox(L"GetCommState Error", MB_OK + MB_ICONERROR);
        CloseHandle(hComm);
        return false;
    }
    m_dcb.BaudRate = BaudRate;
    m_dcb.ByteSize = ByteSize;
    m_dcb.Parity = Parity;
    m_dcb.StopBits = StopBits;
    m_dcb.fBinary = TRUE;
    m_dcb.fDsrSensitivity = false;
    m_dcb.fParity = fParity;
    m_dcb.fOutX = false;
    m_dcb.fInX = false;
    m_dcb.fNull = false;
    m_dcb.fAbortOnError = TRUE;
    m_dcb.fOutxCtsFlow = FALSE;
    m_dcb.fOutxDsrFlow = false;
    m_dcb.fDtrControl = DTR_CONTROL_DISABLE;
    m_dcb.fDsrSensitivity = false;
    m_dcb.fRtsControl = RTS_CONTROL_DISABLE;
    m_dcb.fOutxCtsFlow = false;
    m_dcb.fOutxCtsFlow = false;

    m_bPortReady = SetCommState(hComm, &m_dcb);
    if (m_bPortReady == 0) {
        AfxMessageBox(L"SetCommState Error", MB_OK + MB_ICONERROR);
        CloseHandle(hComm);
        return false;
    }
    return true;
}
BOOL Serialmonitoring::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant)
{
    if ((m_bPortReady = GetCommTimeouts(hComm, &m_CommTimeouts)) == 0)
        return false;
    m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout;
    m_CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant;
    m_CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier;
    m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant;
    m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier;
    m_bPortReady = SetCommTimeouts(hComm, &m_CommTimeouts);
    if (m_bPortReady == 0) {
        AfxMessageBox(L"StCommTimeouts function failed", MB_OK + MB_ICONERROR);
        // MessageBox(L"StCommTimeouts function failed", L"Com Port Error", MB_OK + MB_ICONERROR);
        CloseHandle(hComm);
        return false;
    }

    return true;
}

BOOL Serialmonitoring::WriteData(char bybyte)
{Where 
    // Herecwhere i have to write the data which is come from editbox (IN hexadecimal ) 
    DWORD  dNoOfBytesWritten;
    DWORD dNoOfBytesWritten = strlen(str)+1;
    if (WriteFile(hComm, &bybyte, 1, &dNoOfBytesWritten, NULL) == 0)
        return false;
    else return true;
}

BOOL Serialmonitoring::ReadData(BYTE& resp)
{
   //Here Read the data as hexa decimal but i didnt get 
    BYTE rx;
    resp = 0;

    DWORD dwBytesTransferred = 0;

    if (ReadFile(hComm, &rx, 1, &dwBytesTransferred, 0)) {
        if (dwBytesTransferred == 1) {
            resp = rx;
            return true;
        }
    }

    return false;
}

void Serialmonitoring::ClosePort()
{
    CloseHandle(hComm);
    return;
}




// нажать кнопку

void CCom1Dialog::OnBnClickedSend()
{ 
	UpdateData(true);
	//BYTE data = 0;
	CString rs;
	m_editcomport1.GetWindowText(rs);// the string value which is taking from editbox
	if (!(port.OpenPort(L"COM6"))) {
		MessageBox(L"Cannot open Communication Port.Please\nquit the application & re-start your PC.", L"Error", MB_OK + MB_ICONERROR);
	}
	else {
		if (!(port.ConfigurePort(1920, 8, 0, NOPARITY, ONESTOPBIT))) {
			MessageBox(L"Cannot Configure Communication Port", L"Error", MB_OK + MB_ICONERROR);
			port.ClosePort();
		}
		else {
			if (!(port.SetCommunicationTimeouts(0, 100, 0, 0, 0))) {
				MessageBox(L"Cannot Configure Communication Timeouts", L"Error", MB_OK + MB_ICONERROR);
				port.ClosePort();
			}
			else {
				if (!(port.WriteData(rs))) {
					MessageBox(L"Cannot Write to Port", L"Error", MB_OK + MB_ICONERROR);
					port.ClosePort();
				}
				else {
					if (!(port.ReadData(data))) {
						MessageBox(L"Timeout on getting Response.Please ensure that\nyou have connected the loop back plug to com1.", L"Timeout", MB_OK + MB_ICONEXCLAMATION);
					
						port.ClosePort();
					}
					else {
						m_ed2 = data;
						UpdateData(false);

						TRACE("Read port from data %d", m_ed2);
						m_textareacom1.SetWindowTextW(rs);
						//MessageBox(L"Read from Port completed successfully", L"Success", MB_OK + MB_ICONINFORMATION);
						port.ClosePort();
					}
				}

			}
		}

	}
	
	

Declarations :

<pre>public:
	void ClosePort();
	BOOL ReadData(BYTE& resp);
	BOOL WriteData(char bybyte);
	BOOL OpenPort(CString portname);
	BOOL SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant);
	BOOL ConfigurePort(DWORD BaudRate, BYTE ByteSize, DWORD fParity, BYTE  Parity, BYTE StopBits);
	HANDLE hComm;
	DCB      m_dcb;
	COMMTIMEOUTS m_CommTimeouts;
	BOOL     m_bPortReady;
	BOOL     bWriteRC;
	BOOL     bReadRC;
	DWORD iBytesWritten;
	DWORD iBytesRead;
	DWORD dwBytesRead;


	char str[10];



Пожалуйста пройдите через код n помогите мне



Задача 1. Получение строкового значения из editbox , функции Writedata() как сделать его шестнадцатеричным (char str[100))(должен ли я конвертировать строку в шестнадцатеричную или нет)


problm2 2. ReadData() функции читайте в шестнадцатеричное значение , печать ASCII значение жопу

пожалуйста помогите мне с моим кодом n дайте сонме идею

Richard MacCutchan

"должен ли я преобразовать строку в шестнадцатеричную или нет"
Откуда нам знать? Как я уже говорил вам вчера, это зависит от того, что вы пытаетесь сделать и с каким устройством(устройствами) вы общаетесь.

Member 14837073

Устройство, с которым я работаю на последовательном порту rs232

Проект Smal , который мне дали, - это мониторинг последовательного порта rs232

Данные , которые я отправляю через editbox, его следует записывать в шестнадцатеричном формате n читать в шестнадцатеричном формате и печатать как значение ASCII ...

байт, который вы упомянули, я пробовал писать с 0 байтами n читать с 0 байтами, он работает нормально

но как я могу написать Arry байты в шестнадцатеричном формате в функции WriteData (), которую я получаю из значения edibox

Richard MacCutchan

Вы не можете записывать или считывать данные с порта RS232, если он не подключен к какому-либо устройству, которое будет обрабатывать сообщения. А последовательные устройства вообще не обрабатывают шестнадцатеричные, они читают и пишут в простых 8-битных байтах. Поэтому вам нужно понять, какую информацию должно получать удаленное устройство и какую информацию оно отправляет, прежде чем вы сможете сделать что-то полезное.

2 Ответов

Рейтинг:
2

Richard MacCutchan

RS232 имеет дело только с байтами, поэтому любые данные, которые вы отправляете, должны быть отправлены как поток байтов, и все, что вы получаете, будет таким же. То, что вы делаете с точки зрения представления этого пользователю, зависит от того, в какой форме находятся данные. Например, строка символов ASCII может быть представлена непосредственно, так как каждый символ представляет собой один байт. Двоичные данные должны быть преобразованы в любые значения, которые они представляют, которые могут быть однобайтовыми значениями, 16-битными числами и т. д. Таким образом, реальная проблема заключается в том, какие данные вы пытаетесь передать через этот порт.


Рейтинг:
2

KarstenK

проблема 1: Вы должны получить текст из поля редактирования с помощью GetWindowText.

проблема 2: каждая строка содержит символы в формате ASCII. Таким образом, вам нужно получить доступ к строкам символов, таких как здесь уже ответили.