Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 18

х86+Ассемблер+ЭБУ

12.02.2013, 23:43. Показов 4252. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
x86+Ассемблер+ЭБУ
Есть у меня желание подключиться к "мозгам" автомобиля.
Оборудование:
Ноутбук + ЭБУ "МИКАС-7" + шнур K-line + блок питания на 12v.
Осталось дело за малым - написать программу.
Зачем писать когда в интернете есть готовые?
Собственная программа для - диагностики автомашин выступает в роли - стимулятора для освоения Ассемблера.
Сеичас нахожусь на стадий освоения emu8086.
Задача:
Отправить с ПК через COM-порт1 (Rx,Tx)
Запрос доступности ЭБУ (возвращает код версии ЭБУ).
Команда Ответ ЭБУ
0x01 0x0A,
Мне для начала, надо простую программу(скелет) на MASM32 или FASM.
Миниатюры
х86+Ассемблер+ЭБУ  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2013, 23:43
Ответы с готовыми решениями:

ЭБУ+Bluetooth
Правда ли,что "мозги" авто в постоянном режиме шлют данные(скорость,расход топлива и др..) по каналу блютуз?Случайно услышал такое,не могу...

ЭБУ для 2Т двигателя
На Atmega16A хочу собрать блок управления двухтактным двигателем. Программировать собираюсь на Си. Все вроде как понятно, кроме того как...

простой ЭБУ двигателем
Посмотрев на цены и уровень шаманства вокруг мегаскврирта (есть такой набор "сделай сам себе ЭБУ"), я захотел разобраться в...

23
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 18
23.12.2016, 21:35  [ТС]
Студворк — интернет-сервис помощи студентам
Почему не читает порт?
В порт пишет.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
.486 
 .model flat, stdcall 
 option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
; include \masm32\include\shell32.inc 
; include \masm32\include\masm32.inc 
; include \masm32\include\kernel32.inc 
; include \masm32\include\comctl32.inc 
; include \masm32\include\comdlg32.inc 
; include \masm32\include\user32.inc 
; include \masm32\include\gdi32.inc 
; include \masm32\include\windows.inc 
include \masm32\include\masm32rt.inc
; includelib \masm32\lib\masm32.lib 
; includelib \masm32\lib\kernel32.lib 
; includelib \masm32\lib\user32.lib 
; includelib \masm32\lib\gdi32.lib 
; includelib \masm32\lib\comctl32.lib 
; includelib \masm32\lib\comdlg32.lib 
; includelib \masm32\lib\shell32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
.data 
     AppName       db "ComX Test",0 
     comX          db "COM1",0 
     m_data        db "abcd",0 
     values        db "COM1: baud=9600 parity=N data=8 stop=1",0 
     CreateProblem db "Couldn't create Handel",0 
     InitProblem   db "Не удалось инициализировать порт",0 
     WriteProblem  db "Couldn't Write to Port",0 
     ReadProblem   db "Не удается прочитать из порта",0 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
.data? 
     m_dcb DCB <?> 
     m_CommTimeouts COMMTIMEOUTS <?> 
     m_data2       db ? 
     hcomm         dd ? 
     NrOfByte      dd ? 
     dataPointer   dd ? 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
.code 
start: 
 invoke CreateFile,ADDR comX,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL 
     mov hcomm,eax 
   .IF eax==INVALID_HANDLE_VALUE 
 invoke MessageBox,NULL, addr CreateProblem,addr AppName,MB_OK 
     jmp @F 
 .ENDIF 
 
     mov m_CommTimeouts.ReadIntervalTimeout,30 
     mov m_CommTimeouts.ReadTotalTimeoutMultiplier,20 
     mov m_CommTimeouts.ReadTotalTimeoutConstant,100 
     mov m_CommTimeouts.WriteTotalTimeoutMultiplier,20 
     mov m_CommTimeouts.WriteTotalTimeoutConstant,100
 invoke SetCommTimeouts, hcomm,ADDR m_CommTimeouts 
     mov eax,sizeof DCB 
     mov m_dcb.DCBlength,eax 
 invoke GetCommState, hcomm,ADDR m_dcb 
   .IF eax==0 
 invoke BuildCommDCBAndTimeouts,ADDR values,ADDR m_dcb,ADDR m_CommTimeouts 
   .IF eax==0 
 invoke SetCommState, hcomm,ADDR m_dcb 
   .IF eax==1 
     jmp problem1 
 .ENDIF 
; .ELSE 
;     jmp problem1 
 .ENDIF 
;     jmp problem1 
; .ELSE 
;     jmp problem3 
 .ENDIF 
 
 invoke WriteFile,hcomm,addr m_data,4,NULL,NULL ; HANDLE, буфер, Число ожидаемых байт, Число фактически байт, синхронных
   .if eax==0 
     jmp problem2 
 .endif 
 
 invoke ReadFile,hcomm,addr m_data2,4,NULL,NULL ; HANDLE, буфер, Число ожидаемых байт, Число фактически байт, синхронных
   .if eax==0 
     jmp problem3 
 .endif 
 
problem1: 
 invoke MessageBox,NULL, addr InitProblem,addr AppName,MB_OK 
     jmp @F  ;— адрес следующей анонимной метки(@@:)
problem2: 
 invoke MessageBox,NULL, addr WriteProblem,addr AppName,MB_OK 
     jmp @F  ;— адрес следующей анонимной метки(@@:)
problem3: 
 invoke MessageBox,NULL, addr ReadProblem,addr AppName,MB_OK 
     jmp @F  ;— адрес следующей анонимной метки(@@:)
 
@@:         ; (.exit:)
 invoke CloseHandle, hcomm 
 invoke ExitProcess,0 
 
end start
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8679 / 4516 / 1670
Регистрация: 01.02.2015
Сообщений: 13,958
Записей в блоге: 14
26.12.2016, 00:54
Попробуйте или реализовать это на языке высокого уровня (С/Pascal) если получится - проблема в некорректном обращении к API Windows. Если не получиться - можно задать этот вопрос в разделе Win API https://www.cyberforum.ru/win-api/ или https://www.cyberforum.ru/delphi-winapi/
0
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 18
28.12.2016, 12:35  [ТС]
Visual Basic надо перевести в Assembler:
Кликните здесь для просмотра всего текста
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
'   МОДУЛЬ ДЛЯ РАБОТЫ С COM-ПОРТОМ
'            при помощи API.
'--------------------------------------------------------
'для использования в программе здесь четыре подпрограммы:
'OpenCOM -открытие порта. Имеет аргументом единственное число - номер указанного порта.
'SetCommParam -настройка порта. Имеет параметрами четыре числа.
'ReadCOM -функция получения данных с порта. Параметр - количество запрашиваемых символов.
'WriteCOM -отправка данных в порт. Параметр - отправляемая строка символов
 
'Перед завершением программы обязательно закрывайте открытый порт следующим образом:
' If ComNum > 0 Then fin_com = CloseHandle(ComNum)
 
Option Explicit
 
'глобальные переменные
Global ComNum As Long 'хэндл открытого порта; >0, если порт открыт.
Global BarDCB As DCB 'таблица параметров порта
Global CtimeOut As COMMTIMEOUTS 'таймауты порта
Global bRead(2047) As Byte 'буфер принятых символов
 
'Структуры для параметров настройки порта
Type COMMTIMEOUTS
        ReadIntervalTimeout As Long
        ReadTotalTimeoutMultiplier As Long
        ReadTotalTimeoutConstant As Long
        WriteTotalTimeoutMultiplier As Long
        WriteTotalTimeoutConstant As Long
End Type
Type DCB
        DCBlength As Long
        BaudRate As Long
        fBitFields As Long
        wReserved As Integer
        XonLim As Integer
        XoffLim As Integer
        ByteSize As Byte
        parity As Byte
        StopBits As Byte
        XonChar As Byte
        XoffChar As Byte
        ErrorChar As Byte
        EofChar As Byte
        EvtChar As Byte
        wReserved1 As Integer
End Type
 
'структура для операций файлового чтения-записи
Type OVERLAPPED
        Internal As Long
        InternalHigh As Long
        offset As Long
        OffsetHigh As Long
        hEvent As Long
End Type
 
'объявления функций API
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal dwFlags As Long) As Long
Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
Public Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long
 
 
Public Sub OpenCOM(ByVal com As Integer) 'Открытие COM-порта
    Dim retval As Long
 
    ComNum = CreateFile(("COM" + Trim(Str$(com))), &HC0000000, 0, 0&, &H3, 0, 0)
    If ComNum = -1 Then
        MsgBox "Ошибка открытия порта COM" + Trim(Str$(com)), vbCritical
      Else
         retval = PurgeComm(ComNum, 0) 'очистка порта, очередей
    End If
    
    ' Начальное заполнение таблицы параметров приемопередачи
    BarDCB.DCBlength = 28  'длина блока DCB
    BarDCB.BaudRate = 2400  'скорость приемопередачи в бодах
    BarDCB.fBitFields = &H83 'Битовое поле, биты которого означают следующее:
            '1 fBinary вкл двоичный режим. Всегда 1 (кроме Windows 3.x :))
            '2 fParity          1 -проверять четность, возвращать код ошибки.
            '3 fOutxCtsFlow     1 -задействовать сигнал CTS: при сброшенном CTS приостанавливает передачу до появления CTS.
            '4 OutxDsrFlow      1 -точно так же задействовать сигнал DSR
            '5,6 fDtrControl    режим управления DTR. Три значения, не выяснил, каких.
            '7 fDsrSensitivity  чувствительность драйвера к DSR. При 1 драйвер устройства будет игнорировать данные, принятые без DSR.
            '8 fTXContinueOnXoff 0 - прием будет приостанавливаться принятым символом Xoff и возобновляться Xon.
            '9 fOutX            1 -передача будет приостанавливаться принятым символом Xoff и возобновляться Xon.
            '10 fInX            1 -драйвер будет передавать управляющие символы Xon\Xoff
            '11 fErrorChar      1 -при ошибке по четности заменить ошибочный символ на заданный в поле ErrorChar
            '12 fNull           1 -отбрасывать при передаче нулевые байты
            '13,14 fRtsControl  0 -выдавать сигнал RTS. Возможны три значения для выбора режима управления, какая кодировка - не выяснил.
            '15 fAbortOnError   1 -при возникновении ошибки драйвер остановится до вызова функции ClearCommError.
            '16 fDummy2         =0 зарезервировано, не используется.
    BarDCB.wReserved = 0 'не используется, должен быть 0
    BarDCB.XonLim = 128 'Задает минимальное число символов в приемном буфере перед посылкой символа XON
    BarDCB.XoffLim = 64 'Определяет макс кол-во байт в приемном буфере перед посылкой символа XOFF. Оно вычисляется вычитанием данного значения из размера применого буфера (в байтах)
    BarDCB.ByteSize = 8      'разрядность данных (кол-во бит)
    BarDCB.parity = 0      '1-проверять нечетность, 2-проверять четность, 0-не проверять ничего
    BarDCB.StopBits = 0     'количество стоповых бит: 0 -один, 1 -полтора, 2 -два
    BarDCB.XonChar = 17 'символ, используемый в качестве Xon
    BarDCB.XoffChar = 19 'символ, используемый в качестве Xoff
    BarDCB.ErrorChar = 35 'символ, заменяющий принятый с ошибкой
    BarDCB.EofChar = 26 'символ "конец данных"
    BarDCB.EvtChar = 0  'символ для сигнализации о событии
    BarDCB.wReserved1 = 0 'зарезервировано. Не используется.
 
    'Времена ожидания (Time Outs) в миллисекундах
    CtimeOut.ReadIntervalTimeout = 1 'максимальное время между двумя принимаемыми символами.
    CtimeOut.ReadTotalTimeoutConstant = 1 'постоянная часть таймаута на прием
    CtimeOut.ReadTotalTimeoutMultiplier = 1 'время на прием одного символа (для вычисления переменной части таймаута)
    CtimeOut.WriteTotalTimeoutConstant = 20 'постоянная часть таймаута на передачу
    CtimeOut.WriteTotalTimeoutMultiplier = 5 'время на передачу одного символа (для вычисления переменной части таймаута)
                                                         'нулевые времена означают, что таймауты не используются.
 
End Sub
 
    
Public Sub SetCommParam(baud As Long, parity As Byte, bits As Byte, stops As Byte)
'подпрограмма установки параметров порту
'все аргументы- числа:
' baud -скорость обмена в бодах, из принятой шкалы скоростей.
' parity -четность. 1=проверять нечетность, 2=проверять четность, 0=не проверять ничего
' bits -битность данных. Число: 5, 6, 7 или 8 бит.
' stops 0=один стоповый бит, 1=полтора стоповых бита, 2=два стоповых бита.
 
 
    Dim retval As Long
 
    'установка таймаутов
 '   CtimeOut.ReadIntervalTimeout = 1 + Int(12000 / baud)
 '   CtimeOut.ReadTotalTimeoutConstant = 1
 '   CtimeOut.ReadTotalTimeoutMultiplier = 1 + Int(12000 / baud)
    CtimeOut.WriteTotalTimeoutMultiplier = 1 + Int(12000 / baud)
    retval = SetCommTimeouts(ComNum, CtimeOut)
    If retval = -1 Then
        retval = GetLastError()
        MsgBox "Ошибка при установке таймаутов, Error: " & retval
    End If
    
    BarDCB.BaudRate = baud  'скорость приемопередачи в бодах
    BarDCB.ByteSize = bits  'разрядность данных (кол-во бит)
    BarDCB.parity = parity  '1-проверять нечетность, 2-проверять четность, 0-не проверять ничего
    BarDCB.StopBits = stops 'количество стоповых бит: 0 -один, 1 -полтора, 2 -два
    retval = SetCommState(ComNum, BarDCB)
    If retval = -1 Then
        retval = GetLastError()
        MsgBox "Не удается настроить порт на заданные параметры Error: " & retval
    End If
         
End Sub
 
Public Function ReadCOM(ByVal numChar As Integer) As String
'функция приема через COM
'параметр - число принимаемых за раз символов, до 2047
'(при циклическом вызове его можно уменьшить для ускорения работы)
    Dim RetBytes As Long, i As Integer, ReadStr As String, retval As Long
    Dim lpOverlapped As OVERLAPPED
 
    'чтение с порта
    retval = ReadFile(ComNum, bRead(0), numChar, RetBytes, lpOverlapped)
    If retval = 0 Then
        retval = GetLastError()
        MsgBox "Ошибка работы с портом Error: " & retval
    End If
 
    ReadStr = ""
    If (RetBytes > 0) Then
        For i = 0 To RetBytes - 1
            ReadStr = ReadStr + Chr(bRead(i))
        Next i
    End If
 
    ReadCOM = ReadStr
 
End Function
 
Public Sub WriteCOM(COMString As String)
'Подпрограмма передачи в порт.
'Параметр - передаваемая строка символов
 
    Dim RetBytes As Long, LenVal As Long, retval As Long
    Dim lpOverlapped As OVERLAPPED
 
    If COMString = "" Then Exit Sub
 
    'Рекурсивный вызов: передача длинных строк
    'частями по 2048 знаков (потому что буфер приемопередачи- 2048 знаков)
    If Len(COMString) > 2047 Then
        Call WriteCOM(Left$(COMString, 2047))
        Call WriteCOM(Right$(COMString, Len(COMString) - 2047))
        Exit Sub
    End If
 
    'передача знаков в буфер
    For LenVal = 0 To Len(COMString) - 1
        bRead(LenVal) = Asc(Mid$(COMString, LenVal + 1, 1))
    Next LenVal
 
    'передачa через COM
    retval = WriteFile(ComNum, bRead(0), Len(COMString), RetBytes, lpOverlapped)
    If retval = 0 Then
        retval = GetLastError()
        MsgBox "Ошибка передачи Error: " & retval & vbCrLf & "Передано " & RetBytes & " байт"
    End If
End Sub


Добавлено через 2 часа 44 минуты
язык C перевести в в Assembler:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 Приведу пример выполнения настройки порта и выполнения чтения/записи данных. 
 
 #include <windows.h>
 #include <string.h>
 
 . . .
 
 DCB dcb;
 COMMTIMEOUTS ct;
 HANDLE port;
 DWORD bc;
 
 char *buf_out="Test string";
 char *buf_in;
 
 . . .
 
 dcb.DCBlength=sizeof(DCB);
 BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
 dcb.fNull=TRUE;
 
 ct.ReadIntervalTimeout=10;
 ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
 ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
 
 port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
 
 SetCommState(port,dcb);
 SetCommTimeouts(port,&ct);
 PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
 SetupComm(port,256,256);
 
 . . .
 
 buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);
 WriteFile(port,buf_out,strlen(buf_out),&bc,NULL);
 ReadFile(port,buf_in,strlen(buf_out),&bc,NULL);
 
 HeapFree(GetProcessHeap(),0,buf_in);
 CloseHandle(port);
 
 . . .
 
 Если на COM2 установить перемычку между сигналами TxD и RxD, то переменная buf_in, после выполнения ReadFile, будет содержать ту же информацию, что и buf_out. Других пояснений пример не требует, все уже было подробно рассмотрено раньше.
0
0 / 0 / 0
Регистрация: 25.01.2013
Сообщений: 18
24.02.2017, 12:00  [ТС]
язык ? перевести в в Assembler:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
//  История изменений
//      04.07.2000 Изменены характеристики WakeUp импульса была пауза после FO = Sleep(150) стала Sleep(25)
//          (не проверено)
//
//  Версия для МИКАС ЭБУ 5.4.
 
#include "stdafx.h"
 
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h> 
//#include <streams.h> 
#include <edevdefs.h>  
 
 
#include "Tester.h"
#include "uart.h"
 
#define RefreshReceive() RMess_Len=RMess_Ptr=0 // Ждем следующего сообщения.  
 
uart::uart()
{
    BadCRC=0;
    NotToTester=0;
    NotFromMIKAS=0;
    FramesReceived=0;
    BytesReceived=0;
    strncpy(PortCom1,"COM1",5); 
    strncpy(PortCom2,"COM2",5); 
    strncpy(PortCom3,"COM3",5); 
    strncpy(PortCom4,"COM4",5); 
    Was40=FALSE;
 
    pcComPort = NULL;
    hComPort = 0; 
    memset((void *)&m_dcb,0,sizeof(m_dcb));
    memset((void *)&sTimeouts,0,sizeof(sTimeouts));
    UARTErrors=0;
    RxTimeout=20L;
    UartInited=FALSE;
    FrameNotReceived=FALSE;
    Timeout=100; 
}
 
uart::~uart(){}
 
 
void uart::ErrMessageBox(char *TitleString)
{
    UARTErrors++;
/*
LPVOID lpMsgBuf;
    if (UARTErrors>2) return;
            FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,         NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL );
                MessageBox( NULL, (LPCTSTR)lpMsgBuf, TitleString , MB_OK | MB_ICONSTOP );
                LocalFree( lpMsgBuf );  
*/
}
/*****************************************************/
void uart::CloseUart()
{
    if (!UartInited) return;
    UartInited=FALSE;
    if (DeleteFile(pcComPort))  { ErrMessageBox("Ошибка закрытья COM порта.");  return; } 
    pcComPort = NULL;
//  UARTErrors=0;
    if ( !CloseHandle( hComPort ) ) { ErrMessageBox("Ошибка закрытья COM порта.");  return; } 
    hComPort = 0; 
 return;  
}
 
/*****************************************************/
void  uart::FlushUart( void ) 
{ DWORD dwRetByteCnt; 
    DWORD dwCommError; 
    COMSTAT CommStat;
    char buf[256];  
 
//  UARTErrors=0;
    if (PurgeComm(hComPort, PURGE_RXCLEAR)) { ErrMessageBox("Ошибка PurgeСОМ in FlushUart()."); return; } 
    ClearCommError( hComPort, &dwCommError, &CommStat ); 
    if (CommStat.cbInQue) 
        { if(!ReadFile(hComPort, buf,(DWORD)CommStat.cbInQue,(LPDWORD)&dwRetByteCnt,(LPOVERLAPPED)NULL)) {ErrMessageBox("Ошибка ReadСОМ in FlushUart()."); return; } 
    }
}  
 
/************************************************************************/
/*              Процедура      */
/* unchar   InitUart(int *Port)                                 */
/* Принимает:      Номер порта который надо открыть                    */
/*                      (COM1=2=DEV_PORT_COM1, COM2=3=DEV_PORT_COM2,...)*/
/* Возвращает:        0   - если открыл                                 */
/*                  1   - если указано не правильное имя порта           */
/*                  2   - ошибка открытия порта                          */
/*                  3   - невозможно получить DCB                     */
/*                  4   - ошибка установки параметров                  */
/*                  255 -           */
/*************************************************************************/
unchar  uart::InitUart(int Port) 
{
    COM_Port=Port;
    if (UartInited) return 0;
    
    switch (Port)
    { 
    case DEV_PORT_COM1: pcComPort = PortCom1; break; 
    case DEV_PORT_COM2: pcComPort = PortCom2; break; 
    case DEV_PORT_COM3: pcComPort = PortCom3; break; 
    case DEV_PORT_COM4: pcComPort = PortCom4; break; 
    default:  return 1; 
    } 
// пробуем открыть Порт 
    if ( (hComPort = CreateFile( pcComPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL )) == (HANDLE)-1 )  
            {/* Не получилось*/ ErrMessageBox("Ошибка открытия СОМ."); return 2; }  
//  UARTErrors=0;
// Пробуем получить DCB
    if ( !GetCommState( hComPort, &m_dcb ) ) { CloseUart(); ErrMessageBox("Ошибка получения DCB."); return 3; }  
 
    m_dcb.BaudRate = 9600;  m_dcb.fBinary = TRUE;  
    m_dcb.fOutxCtsFlow=FALSE;      // CTS output flow control 
    m_dcb.fOutxDsrFlow=FALSE;      // DSR output flow control 
    m_dcb.fDtrControl = DTR_CONTROL_ENABLE; 
    m_dcb.fDsrSensitivity = FALSE;     //   m_dcb.fTXContinueOnXoff=TRUE; // XOFF continues Tx 
    m_dcb.fOutX = FALSE;    m_dcb.fInX = FALSE;     
    m_dcb.fNull = FALSE;    
    m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
    m_dcb.fAbortOnError = FALSE;  m_dcb.ByteSize = 8;     
    m_dcb.fParity=FALSE; 
    m_dcb.Parity = NOPARITY;     // 0-4=no,odd,even,mark,space
    m_dcb.StopBits = ONESTOPBIT;  // 0,1,2 = 1, 1.5, 2 
/*
    DWORD fErrorChar: 1;       // enable error replacement 
*/
    if(!SetCommState(hComPort, &m_dcb))     {   ErrMessageBox("Ошибка установки параметров СОМ (9600bps).");    }
    if (!GetCommTimeouts(hComPort, &sTimeouts)){ErrMessageBox("Ошибка Получения таймаутов СОМ.");CloseUart();return 5; } 
    sTimeouts.ReadIntervalTimeout = RxTimeout; 
    sTimeouts.ReadTotalTimeoutMultiplier = 1L; 
    sTimeouts.ReadTotalTimeoutConstant = RxTimeout; 
    sTimeouts.WriteTotalTimeoutMultiplier = 0L; 
    sTimeouts.WriteTotalTimeoutConstant = 0L; 
    if (!SetCommTimeouts(hComPort, &sTimeouts)){ErrMessageBox("Ошибка установки таймаутов СОМ.");CloseUart();return 6; } 
    UartInited=TRUE;
    return 0;
}
 
/************************************************************************************/
// Программа выдает Wake-Up импульс: 25 мсек. затем пауза 50 мсек.  
 
unchar  uart::WakeUpImpuls(int Port) 
{
BOOL    WasInited=FALSE;
LPDWORD Actual;
unsigned char   WakeupByte;
    
    if (UartInited) {WasInited=TRUE; CloseUart();}
 
    switch (Port)
    { 
    case DEV_PORT_COM1: pcComPort = PortCom1; break; 
    case DEV_PORT_COM2: pcComPort = PortCom2; break; 
    case DEV_PORT_COM3: pcComPort = PortCom3; break; 
    case DEV_PORT_COM4: pcComPort = PortCom4; break; 
    default:  return 1; 
    } 
// пробуем открыть Порт 
    if ( (hComPort = CreateFile( pcComPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL )) == (HANDLE)-1 )  
            {/* Не получилось*/ ErrMessageBox("Ошибка открытия СОМ Wakeup.");  
            if (WasInited) InitUart(COM_Port);
            return 2; }  
// Пробуем получить DCB
    if ( !GetCommState( hComPort, &m_dcb ) )    { ErrMessageBox("Ошибка получения DCB Wakeup."); }  
 
    m_dcb.BaudRate = 200;   m_dcb.fBinary = TRUE;  m_dcb.fOutxCtsFlow=FALSE;      // CTS output flow control 
    m_dcb.fOutxDsrFlow=FALSE;      // DSR output flow control 
    m_dcb.fDtrControl = DTR_CONTROL_DISABLE; m_dcb.fDsrSensitivity = FALSE;     //  m_dcb.fTXContinueOnXoff=TRUE; // XOFF continues Tx 
    m_dcb.fOutX = FALSE;    m_dcb.fInX = FALSE;     
    m_dcb.fNull = FALSE;    
    m_dcb.fRtsControl = RTS_CONTROL_DISABLE;
    m_dcb.fAbortOnError = FALSE;  m_dcb.ByteSize = 8;     
    m_dcb.fParity=FALSE; m_dcb.Parity = NOPARITY;     // 0-4=no,odd,even,mark,space
    m_dcb.StopBits = ONESTOPBIT;  // 0,1,2 = 1, 1.5, 2 
    if(!SetCommState(hComPort, &m_dcb)) ErrMessageBox("Ошибка установки параметров СОМ (200bps)  Wakeup."); 
 
// Выдаем Wake-Up импульс: 25 мсек. затем пауза 50 мсек. 
    WakeupByte=0xF0;
    if ( !WriteFile(hComPort, &WakeupByte,1,(LPDWORD)&Actual,(LPOVERLAPPED)NULL ) ) ErrMessageBox("Ошибка Write in COM in WriteBytes() in Wakeup."); 
    Sleep(25);
    
    if (DeleteFile(pcComPort))  ErrMessageBox("Ошибка закрытья COM порта Wakeup.");   
    pcComPort = NULL;
    if ( !CloseHandle( hComPort ) ) ErrMessageBox("Ошибка закрытья COM порта Wakeup.");  
    hComPort = 0; 
 
    if (WasInited) {InitUart(COM_Port); }
 
    return 0;
}
 
unchar CRC;
 
/************************************************************************/
/*              Процедура приема байта из последовательного порта.      */
/*                                                                      */
/* unchar   ParseByte(unchar RByte)                                 */
/* Принимает:      Считанный байт.                                        */
/* Возвращает:        0   - Сообщение еще не принято                     */
/*                  1   - сообщение не к тестеру Dst!=0xF1               */
/*                  2   - сообщение не от МИКАС DST!=0x10             */
/*                  3   - Плохая контрольная сумма                        */
/*                  255 -           */
/*************************************************************************/
unchar  uart::ParseByteGAZ(unchar RByte)
{
    BytesReceived++;
    CRC+=RByte;
// Сохраним принятый байт в буфер.
    if (Was40==TRUE) {  rMessage[RMess_Ptr-1]+=RByte; Was40=FALSE;  return 0; }
    else    {rMessage[RMess_Ptr++]=RByte; RMess_Len++;}
    if (RByte == 0x40)  { Was40=TRUE; return 0; }
//  if (RMess_Ptr < 3) return 0; // Заголовок еще не принят возвращаемся.
    if (RByte == 0x0D)  
    {   // Все сообщение принято.
        FramesReceived++;
        if ((signed char)CRC!=0x0D) { BadCRC++; RefreshReceive(); return 3; }
        // Контрольная суммы Ок. Копируем полезную информацию в буфер
        return (char)0xFF;
    }
    return 0;
}
 
/************************************************************************/
/*              Процедура приема байта из последовательного порта.      */
/*                                                                      */
/* char ReceiveByte(unchar RByte)                                       */
/* Принимает:      Байт считанный из UART                               */
/* Возвращает:        0   - если прим кадра не завешен                  */
/*                  1   - если принято сообщение не для тестера         */
/*                  2   - если принято сообщение не от МИКАС           */
/*                  3   - если принято сообщение с ошибкой CRC          */
/*                  255 - если принято сообщение нормальное сообщение    */
/*************************************************************************/
 
unchar uart::ReadByte()
{   
    unchar buf[2];
    DWORD   Actual;
    TimeIsOut=FALSE;
    if ( !ReadFile(hComPort, buf,(DWORD)1,(LPDWORD)&Actual,(LPOVERLAPPED)NULL ) ) 
    { ErrMessageBox("Ошибка Read from COM in ReadByte()."); TimeIsOut=TRUE; return 0xFF;}
    if (Actual==0) TimeIsOut=TRUE;
return buf[0];
}
 
 
void uart::SetRxTimeOut(unsigned short Time) {  Timeout=Time;   FrameNotReceived=FALSE; }
 
 /***********************************************************************/
 /*                                                                     */
 /*                 Процедура запуска приемника UART.                  */
 /*                                                                     */
 /* void ReceiveBytes(void)                                             */
 /* Принимает:     ничего не принимает.                               */
 /* Возвращает:       .                                                   */
 /*                                                                     */
 /***********************************************************************/
       
void uart::ReceiveBytes(void)   
{
    unchar  Byte, State;
    unsigned long Time;
    CRC=0;
    memset(rMessage,0,BUFF_LEN-1);
    Time=0; RefreshReceive();   State=0; FrameNotReceived=FALSE;
    while ( State != 0xFF  ) 
    {   Byte=ReadByte();
    if ( !TimeIsOut ) { State=ParseByteGAZ(Byte); Time=0;}
        else { Time+=RxTimeout; //sprintf((char *)&t[0],"%ic.",Time); m_wndStatusBar.SetPaneText( 1, (LPCTSTR) &t, TRUE );
            if (Time>=Timeout)  {FrameNotReceived=TRUE; break;}
        }
    }
}
 
 
void uart::WriteBytes(unchar *Message_P,unchar Len) 
{
    unchar  buf[BUFF_LEN+2];
    DWORD   Actual;
//  memset(&buf,0,BUFF_LEN-1)
    sMess_Len=Len;
    if ( !WriteFile(hComPort, Message_P,Len,(LPDWORD)&Actual,(LPOVERLAPPED)NULL ) ) 
    { 
        if (Actual!=Len) ErrMessageBox("Ошибка Cant Write all bytes to COM in WriteBytes()."); 
        else    ErrMessageBox("Ошибка Write in COM in WriteBytes()."); 
        return; 
    } 
    // Читаем назад
    Sleep(3);
    if ( !ReadFile(hComPort, buf,Len,(LPDWORD)&Actual,(LPOVERLAPPED)NULL ) ) 
    {
        ErrMessageBox("Ошибка Read echo from COM in WriteBytes()."); return; 
    } 
    if (Actual!=Len) 
        ErrMessageBox("Ошибка Cant read all bytes from COM in WriteBytes()."); 
    else {if (memcmp(Message_P,buf,Len))        
            {   ErrMessageBox("Ошибка считали не то что писали COM in WriteBytes()."); return; } 
 
    }
}
 
 
/************************************************************************/
/*              Процедура посылки кадра в последовательный порт.      */
/*                                                                      */
/* char SendBytes(unchar Len)                                   */
/* Принимает:      Байт длинны посылки                                    */
/*                  Данные сообщения должны быть помещены              */
/*                     в буфер Message с нулевого смещения.              */
/* Возвращает:        0   -                   */
/*                  1 -     ошибка длинны                               */
/*                  255 - если сообщение полностью послано             */
/*************************************************************************/
unchar  uart::SendBytesGAZ(unchar Len)
{
    unchar i, CRC, n;
 
    n=Len;
    memset(&sMessage[n],0,BUFF_LEN-1-n);
    if ( (n==0) || (n>(BUFF_LEN-5)) ) {return 1;}
 
    for ( i=0; i!=n; i++ ) 
    { 
        if (sMessage[i]==0x0D) {n++; memmove(&sMessage[i+1], &sMessage[i], (n-i)); sMessage[i++]=0x40; sMessage[i]=0xCD; } 
        if (sMessage[i]==0x40) {n++; memmove(&sMessage[i+1], &sMessage[i], (n-i)); sMessage[i++]=0x40; sMessage[i]=0x00; } 
    }
 
    sMessage[n+1]=0x0D;
    // Вычисляем CRC и кладем ее в конец сообщения
    for ( i=CRC=0; i!=n; i++ ) CRC+=sMessage[i];
    sMessage[n]=-(signed char)CRC;
    //n++;
    WriteBytes(&(sMessage[0]),n+2);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2017, 12:00

Есть ли шанс оживить ЭБУ
Залило тосолом, погорели дорожки. Это можно оживить? Или проще купить новый?

команды ЭБУ Opel Astra
хочу сделать подобие бортового компа с несколькими фичами. результатом в случае успеха конечно поделюсь. Но сейчас возникла проблема: нигде...

кокой контроллер в ЭБУ январь 7,2
Добрый день всем. знает кто нибудь на каком микрконтроллере сдалан ЭБУ январь 7,2 для ВАЗ. или у кого есть принципиальная схему такого...

Обмен данными с ЭБУ через RS-232
Всем добра, уважаемые форумчане! Это мой первый пост, прошу сильно не ругать:) Итак, поехали: Задача- &quot;поговорить&quot; с ЭБУ...

Разработка программы для ЭБУ автомобиля
Решил попробовать разработать программу для ЭБУ автомобиля. Думаю писать на C#. Но даже не знаю с какого конца подойти. Буду...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru