Как отправить данные в порт 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-битных байтах. Поэтому вам нужно понять, какую информацию должно получать удаленное устройство и какую информацию оно отправляет, прежде чем вы сможете сделать что-то полезное.