Ярлыки
ДШИ-200
(1)
КСВУ-6
(1)
ЛЧМ
(1)
МДР-23
(1)
микроконтроллер
(1)
перенаправление
(1)
С
(1)
структуры
(1)
учебный курс
(1)
AC/DC
(1)
ADC
(1)
ADS1248
(1)
Altium
(1)
Altuim
(1)
Amolifer
(1)
ARM
(1)
assembler
(2)
Asynchronous
(1)
at command
(3)
at#eaddr
(1)
at#epassw
(1)
at#esmtp
(1)
at#euser
(1)
at#gprs
(1)
at#selint=2
(1)
at#sgact
(1)
at#tcpatcmdseq
(1)
ATX
(1)
AVR
(2)
bit
(1)
boost
(1)
boot
(2)
bootlloader
(1)
C
(6)
C#
(7)
C++
(1)
CMSIS
(1)
command
(1)
CP2101
(1)
CSD
(1)
Danfoss
(6)
DBGMCU
(1)
debug
(1)
debug.ini
(1)
delegate
(1)
Discovery
(1)
DMA
(1)
DRV8805
(1)
DWT
(1)
e-mail
(1)
email
(1)
Exel
(1)
exFAT
(1)
FC-051
(1)
gl868-dual
(2)
gl868-dual cmux
(1)
GPIO
(2)
GSM
(1)
I2C
(1)
IAR
(1)
ID
(1)
Invoke
(1)
Keil
(3)
LabVIEW
(1)
Linux
(1)
LMP7721
(1)
LoRa
(3)
mdmread
(1)
memory
(1)
MODBUS
(1)
Operation Amplifer
(1)
pack
(1)
printf
(2)
printf()
(1)
RCC
(1)
retargetting
(1)
RFM95/96/87/98(W)
(1)
RS232
(4)
RS485
(1)
RSAPI.DLL
(1)
RSS
(1)
RTC
(2)
send
(2)
SerialPort
(1)
Silabs
(1)
spl
(1)
standard peripherals library
(1)
startup
(1)
stepper
(2)
STlink
(1)
STlink/V2
(2)
STM32
(10)
stm32 stm32f10x
(1)
STM32DBG.IN
(1)
STM32F
(19)
STM32F103
(4)
struct
(1)
Structure
(1)
system
(1)
SystemInit
(1)
Task
(1)
telit
(5)
thread
(4)
TIM
(1)
Type Cast
(1)
UART
(1)
uni-trend
(1)
USART
(6)
USB
(1)
UT61B
(1)
viewer
(1)
суббота, 25 июня 2016 г.
вторник, 14 июня 2016 г.
Altium Key
Интерактивная трассировка
Режим размещения проводника на плату включается командой меню Place→Interactive Routing или соответствующей пиктограммой из инструментов меню . Рассмотрим режимы интерактивной трассировки, для чего после выбора инструмента Place→Interactive Routing выберите начальную контактную площадку и нажимайте Shift+R, до появления режима Ignore. Название режима отображается в строке состояния, под вкладками слоев или во всплывающей информации в левом верхнем углу рабочей области.
Всего имеется 4 режима:
1) Ignore Obstacle – игнорирование препятствий. Практически ручной режим, в котором не соблюдаются ранее созданные правила проектирования.
2) Walkaround Obstacle – огибание препятствий. Программа огибает конфликтный объект с учетом минимальных зазоров и по оптимальной траектории.
3) Push Obstacle – расталкивание препятствий. В этом режиме приоритет отдается прокладываемой дорожке и все встречающиеся элементы топологии (трассы, переходные отверстия) расталкиваются с учетом правил.
4) Hug and Push Obstacle – огибание и расталкивание препятствий. В отличии от писанного режима Walkaround, программа огибает препятствия только в заданном направлении, а не предлагает оптимальный вариант. Причем, в узких участках, при невозможности обогнуть конфликтный объект, дорожка отталкивает его в сторону.
Режим размещения проводника на плату включается командой меню Place→Interactive Routing или соответствующей пиктограммой из инструментов меню . Рассмотрим режимы интерактивной трассировки, для чего после выбора инструмента Place→Interactive Routing выберите начальную контактную площадку и нажимайте Shift+R, до появления режима Ignore. Название режима отображается в строке состояния, под вкладками слоев или во всплывающей информации в левом верхнем углу рабочей области.
Всего имеется 4 режима:
1) Ignore Obstacle – игнорирование препятствий. Практически ручной режим, в котором не соблюдаются ранее созданные правила проектирования.
2) Walkaround Obstacle – огибание препятствий. Программа огибает конфликтный объект с учетом минимальных зазоров и по оптимальной траектории.
3) Push Obstacle – расталкивание препятствий. В этом режиме приоритет отдается прокладываемой дорожке и все встречающиеся элементы топологии (трассы, переходные отверстия) расталкиваются с учетом правил.
4) Hug and Push Obstacle – огибание и расталкивание препятствий. В отличии от писанного режима Walkaround, программа огибает препятствия только в заданном направлении, а не предлагает оптимальный вариант. Причем, в узких участках, при невозможности обогнуть конфликтный объект, дорожка отталкивает его в сторону.
суббота, 4 июня 2016 г.
Altium designer
http://we.easyelectronics.ru/faq/faq-po-rabote-v-altium-designer.html
http://we.easyelectronics.ru/treasure/altium-pravila.html
http://forum.ixbt.com/post.cgi?id=print:48:5410
http://microsin.net/adminstuff/others/altium-designer-howto.html
FAQ Altium Designer
Для начала: что можно почитать
http://electronix.ru/forum/index.php?showtopic=43659&st=47
http://www.rodnik.ru/product/sapr/literature/altium_designer/spisok/
http://www.eurointech.ru/index.sema?a=pages&id=27
http://tech-e.ru/author_art.php?author=Пранович
Знакомство с программой Altium Designer 6: http://www.soel.ru/issues/?id=343865
Где скачать готовые 3D-модели компонентов?
http://electronix.ru/forum/index.php?showtopic=12227
http://www.3dcontentcentral.com/
http://cad-design.ru/downloads/library.html
http://www.tracepartsonline.net/
Основные разделы:
1. Общее
2. Библиотеки
3. Схемный редактор
4. PCB редактор
5. Вывод информации
http://we.easyelectronics.ru/treasure/altium-pravila.html
http://forum.ixbt.com/post.cgi?id=print:48:5410
http://microsin.net/adminstuff/others/altium-designer-howto.html
FAQ Altium Designer
Для начала: что можно почитать
http://electronix.ru/forum/index.php?showtopic=43659&st=47
http://www.rodnik.ru/product/sapr/literature/altium_designer/spisok/
http://www.eurointech.ru/index.sema?a=pages&id=27
http://tech-e.ru/author_art.php?author=Пранович
Знакомство с программой Altium Designer 6: http://www.soel.ru/issues/?id=343865
Где скачать готовые 3D-модели компонентов?
http://electronix.ru/forum/index.php?showtopic=12227
http://www.3dcontentcentral.com/
http://cad-design.ru/downloads/library.html
http://www.tracepartsonline.net/
Основные разделы:
1. Общее
2. Библиотеки
3. Схемный редактор
4. PCB редактор
5. Вывод информации
вторник, 31 мая 2016 г.
Внутриимпульсная частотная модуляция
Сигнал с внутриимпульсной частотной модуляцией – это радиоимпульс, высокочастотное заполнение которого имеет переменную частоту.
ЛЧМ – сигналы. Если закон изменения мгновенной частоты заполнения имеет линейный характер, то такие сигналы носят название ЛЧМ – сигналов (линейная частотная модуляция). Наиболее широкое применение они получили в радиолокации. Пример ЛЧМ – сигнала с огибающей прямоугольной формы
ЛЧМ – сигналы имеют одно замечательное свойство. Если сигнал подать на частотно-зависимую линию задержки, время задержки сигнала которой велико на малых частотах (в начальной части ЛЧМ – сигнала) и уменьшается по мере нарастания частоты в ЛЧМ – сигнале, то на выходе такой линии происходит "сжатие" сигнала в один период высокочастотного колебания путем суммирования амплитудных значений всех периодов сигнала. При этом происходит увеличение амплитуды выходного сигнала и уменьшение статистических шумов, так как суммируемые одновременно по этим же периодам шумы не коррелированны.
В показанный на рисунке момент времени распространяющийся вправо ЛЧМ-импульс точно совпадает с решеткой преобразователя. При этом на выходных клеммах преобразователя формируется мощный выходной импульс. Это дисперсионный фильтр, в котором низкочастотная часть сигнала задерживается на большее время, чем высокочастотная, в результате чего «хвост» длинного входного импульса догоняет его начало, — таким образом, происходит сжатие импульса.
Такой метод сжатия импульсов имеет огромное значение для различных систем. Наверное, наиболее известным примером являются радиолокационные системы, использующие сжатие импульса, в которых радиолокационной станцией излучается ЛЧМ-импульс; после отражения от цели он проходит через фильтр сжатия импульса, сжимающий его в короткий импульс. Таким образом, для дальней радиолокации можно использовать длинный импульс, имеющий большую энергию, и сжимать его в приемнике в короткий мощный импульс для повышения разрешающей способности по времени расстоянию.
В скрытных радиолокационных системах и секретных системах связи внутриимпульсная линейная частотная модуляция представляет собой один из методов кодирования сигнала. Наблюдателю необходимо для приема информации знать код (т. е. скорость модуляции) и иметь фильтр сжатия ЛЧМ-сигнала, настроенных на такую же скорость.
ЛЧМ – фильтры используются в скрытых системах радиолокации, секретных системах связи.
ЛЧМ-сигнал может быть даже ниже уровня теплового или фонового шума, но при приеме компрессионным приемником, содержащим ЛЧМ фильтр, согласованный со скоростью модуляции, сигнал будет выделяться на фоне этих шумов из-за увеличения отношения сигнал/шум, обусловленного сжатием импульса.
ЛЧМ – сигналы. Если закон изменения мгновенной частоты заполнения имеет линейный характер, то такие сигналы носят название ЛЧМ – сигналов (линейная частотная модуляция). Наиболее широкое применение они получили в радиолокации. Пример ЛЧМ – сигнала с огибающей прямоугольной формы
ЛЧМ – сигналы имеют одно замечательное свойство. Если сигнал подать на частотно-зависимую линию задержки, время задержки сигнала которой велико на малых частотах (в начальной части ЛЧМ – сигнала) и уменьшается по мере нарастания частоты в ЛЧМ – сигнале, то на выходе такой линии происходит "сжатие" сигнала в один период высокочастотного колебания путем суммирования амплитудных значений всех периодов сигнала. При этом происходит увеличение амплитуды выходного сигнала и уменьшение статистических шумов, так как суммируемые одновременно по этим же периодам шумы не коррелированны.
В показанный на рисунке момент времени распространяющийся вправо ЛЧМ-импульс точно совпадает с решеткой преобразователя. При этом на выходных клеммах преобразователя формируется мощный выходной импульс. Это дисперсионный фильтр, в котором низкочастотная часть сигнала задерживается на большее время, чем высокочастотная, в результате чего «хвост» длинного входного импульса догоняет его начало, — таким образом, происходит сжатие импульса.
Такой метод сжатия импульсов имеет огромное значение для различных систем. Наверное, наиболее известным примером являются радиолокационные системы, использующие сжатие импульса, в которых радиолокационной станцией излучается ЛЧМ-импульс; после отражения от цели он проходит через фильтр сжатия импульса, сжимающий его в короткий импульс. Таким образом, для дальней радиолокации можно использовать длинный импульс, имеющий большую энергию, и сжимать его в приемнике в короткий мощный импульс для повышения разрешающей способности по времени расстоянию.
В скрытных радиолокационных системах и секретных системах связи внутриимпульсная линейная частотная модуляция представляет собой один из методов кодирования сигнала. Наблюдателю необходимо для приема информации знать код (т. е. скорость модуляции) и иметь фильтр сжатия ЛЧМ-сигнала, настроенных на такую же скорость.
ЛЧМ – фильтры используются в скрытых системах радиолокации, секретных системах связи.
ЛЧМ-сигнал может быть даже ниже уровня теплового или фонового шума, но при приеме компрессионным приемником, содержащим ЛЧМ фильтр, согласованный со скоростью модуляции, сигнал будет выделяться на фоне этих шумов из-за увеличения отношения сигнал/шум, обусловленного сжатием импульса.
Руководство разработчика LoRa-модемов SX1272 /3/6/7/8 от компании Semtech
1. ОБЩИЕ СВЕДЕНИЯ
В этом руководстве приведены основные сведения, необходимые для оценки целесообразности применения LoRa-модема в проектируемом радиотехническом изделии. Описание конструктивных параметров разбито на два раздела: в одном рассматриваются основные параметры, а в другом — дополнительные.
В этом руководстве приведены основные сведения, необходимые для оценки целесообразности применения LoRa-модема в проектируемом радиотехническом изделии. Описание конструктивных параметров разбито на два раздела: в одном рассматриваются основные параметры, а в другом — дополнительные.
2. ПРИНЦИПЫ ПРОЕКТИРОВАНИЯ УСТРОЙСТВ С ПРИМЕНЕНИЕМ МОДУЛЯЦИИ LoRa
2.1. Метод модуляции LoRa
LoRa (Long Range) - это схема модуляции с расширением спектра, в которой данные кодируются широкополосными ЛЧМ-импульсами с частотой, увеличивающейся или уменьшающейся на некотором временном интервале. У этого подхода два основных преимущества: значительное повышение чувствительности приемника за счет расширения спектра и низкая критичность к расстройке по частоте между приемником и передатчиком. Чтобы лучше понять принципы проектирования радиотехнических устройств с использованием модуляции в формате LoRa, нужно вкратце рассмотреть факторы, влияющие на чувствительность приемника.
2.2. Чувствительность приёмника
Чувствительность радиоприемника при комнатной температуре дается следующей формулой:
Чувствительность радиоприемника при комнатной температуре дается следующей формулой:
суббота, 21 мая 2016 г.
среда, 30 марта 2016 г.
ADS1248 ADS1247 ADS1246
ADS 1246/7/8 предназначены для измерения температуры с помощь терморезисторов (RTD resistive temperature device) или термопар (thermocouple). Высокая точность измерений достигается благодаря использованию 24-разрядного АЦП, интегрированного входного мультиплексора и ЦАП, задающего измерительный ток.
понедельник, 7 марта 2016 г.
GSM CSD connection
http://www.hwkitchen.com/news/at-command-tester-tutorial-for-gsm-gps-playground/
АТ+CBST = 71,0,1
AT+CSNS=4
ATDxxxxxxx
ATA
CONNECT 9600
На каждый сигнал вызова модем будет выдавать ответ RING. Чтобы поднять трубку, надо послать в модем команду ATA. После поднятия трубки и успешного установления соединения будет выдана текстовая строка типа:
CONNECT 9600
С этого момента он переходит из текстового режима АТ-команд в режим передачи данных. Все принимаемые байты будут отправляться в RS-232, все передаваемые в модем данные будут отправляться в эфир.
Т.о. мы получили почти прозрачное соединение(некое подобие длиннющего кабеля, соединяющего 2 СОМ-порта). Я говорю «почти прозрачное», потому что модем изначально требует некоторой инициализации и даже при настройке автоподнятия трубки выдает некоторые незапрашиваемые результирующие ответы типа RING, CONNECT, NO CARRIER и т.д.
Чтобы разорвать соединение, нужно перейти в режим АТ-команд. Для этого сделайте паузу более секунды и быстро передайте 3 плюса( +++ ). Модем скажет OK – все, теперь можно завершить связь командой ATH – повесить трубку. Если же вы передумали или входили в АТ-режим по другой причине(например для смены настроек), то чтобы возвратиться в режим передачи данных наберите команду ATO.
choise for CBST
0 Автоматический выбор скорости
1 300bps V.21
2 1200bps V.22
3 1200/75bps V.23
4 2400bps V.22bis
6 4800bps V.32
7 9600bps V.32
12 9600bps V.34
14 14400bps V.34
15 19200bps V.34
65 300bps V.110
66 1200bps V.110
68 2400bps v.110 (ISDN)
70 4800bps v.110 (ISDN)
71 9600bps v.110 (ISDN)
75 14400bps v.110 (ISDN)
79 19200bps v.110 (ISDN)
80 28800bps v.110 (ISDN)
81 38400bps v.110 (ISDN)
82 48000bps v.110 (ISDN)
83 56000bps v.110 (ISDN)
choise for CSNS
0 voice
1 alternating voice/fax, voice first (TS 61)
2 fax (TS 62)
3 alternating voice/data, voice first (BS 61)
4 data
5 alternating voice/fax, fax first (TS 61)
6 alternating voice/data, data first (BS 61)
7 voice followed by data (BS 81)
Connection from A-Side to B-Side
АТ+CBST = 71,0,1
AT+CSNS=4
ATDxxxxxxx
ATA
CONNECT 9600
На каждый сигнал вызова модем будет выдавать ответ RING. Чтобы поднять трубку, надо послать в модем команду ATA. После поднятия трубки и успешного установления соединения будет выдана текстовая строка типа:
CONNECT 9600
С этого момента он переходит из текстового режима АТ-команд в режим передачи данных. Все принимаемые байты будут отправляться в RS-232, все передаваемые в модем данные будут отправляться в эфир.
Т.о. мы получили почти прозрачное соединение(некое подобие длиннющего кабеля, соединяющего 2 СОМ-порта). Я говорю «почти прозрачное», потому что модем изначально требует некоторой инициализации и даже при настройке автоподнятия трубки выдает некоторые незапрашиваемые результирующие ответы типа RING, CONNECT, NO CARRIER и т.д.
Чтобы разорвать соединение, нужно перейти в режим АТ-команд. Для этого сделайте паузу более секунды и быстро передайте 3 плюса( +++ ). Модем скажет OK – все, теперь можно завершить связь командой ATH – повесить трубку. Если же вы передумали или входили в АТ-режим по другой причине(например для смены настроек), то чтобы возвратиться в режим передачи данных наберите команду ATO.
choise for CBST
0 Автоматический выбор скорости
1 300bps V.21
2 1200bps V.22
3 1200/75bps V.23
4 2400bps V.22bis
6 4800bps V.32
7 9600bps V.32
12 9600bps V.34
14 14400bps V.34
15 19200bps V.34
65 300bps V.110
66 1200bps V.110
68 2400bps v.110 (ISDN)
70 4800bps v.110 (ISDN)
71 9600bps v.110 (ISDN)
75 14400bps v.110 (ISDN)
79 19200bps v.110 (ISDN)
80 28800bps v.110 (ISDN)
81 38400bps v.110 (ISDN)
82 48000bps v.110 (ISDN)
83 56000bps v.110 (ISDN)
choise for CSNS
0 voice
1 alternating voice/fax, voice first (TS 61)
2 fax (TS 62)
3 alternating voice/data, voice first (BS 61)
4 data
5 alternating voice/fax, fax first (TS 61)
6 alternating voice/data, data first (BS 61)
7 voice followed by data (BS 81)
пятница, 5 февраля 2016 г.
Asynchronous Method Invocation (Асинхронный вызов метода)
Асинхронные вызовы методов
Введение
В этой статье мы поговорим об асинхронном вызове методов и о том, как это делается. После того, как я наигрался с делегатами, потоками и асинхронными вызовами, было бы грехом не поделиться моими знаниями, я надеюсь что это поможет вам и вы не будете в час ночи лезть в MSDN и проклинать себя за то, что связались с этими компьютерами. Мы пойдем маленькими шажками, с большим количеством примеров. В целом я расскажу о том, как асинхронно вызывать методы, как передавать в них параметры и как узнать о их завершении. В конце мы рассмотрим паттерн Команда (Command Pattern) в немного упрощенном представлении. Самое большое преимущество асинхронных методов в .NET – это то, что вы можете взять любой метод вашего проекта и просто вызвать его асинхронно, без какого либо вмешательства в его код. Хотя все происходит за кулисами .NET, очень важно понимать, что же там происходит и мы это выясним.Синхронно и асинхронно
Давайте я попытаюсь объяснить синхронный и асинхронный вызов метода на примере.Синхронный вызов метода
Предположим, у нас есть функция Foo(), которая требует 10 секунд на выполнение.private void Foo() { // sleep for 10 seconds. Thread.Sleep(10000); }
Итак, когда ваше приложение вызывает метод Foo(), ему требуется 10 секунд на то, что бы Foo() завершился и управление перешло вызвавшему его потоку. Если же мы хотим вызвать этот метод 100 раз, то, как вы уже догадались, вам потребуется 1000 секунд для возвращения к вызвавшему потоку. Этот тип вызова и называется синхронным.
- Вызов функции Foo()
- Foo() закончила выполнение
- Управление переходит обратно к вызвавшему потоку
// Создание делегата MethodInvoker // указывающий на метод Foo() MethodInvoker simpleDelegate = new MethodInvoker(Foo); // Вызов Foo simpleDelegate.Invoke();Даже в данном примере мы вызываем Foo() синхронно. Вызывающий поток должен дождаться, когда фукнция Invoke() закончит выполнение и уже после этого управление переходит вызывающему потоку.
Асинхронный вызов метода
А что, если мы хотим вызывать Foo() и не ждать его выполнения? На самом деле, что если я не хочу заботиться о том, когда они завершатся? Скажем, мне нужно выполнить Foo() 100 раз без ожидания завершения каждой функции. Этот принцип называется “Выстрелил и забыл” (Fire and Forget). Вы вызываете функцию, но не ждете ее, а просто забываете о ней. Но…. не забываете. Я не изменю ни строчки кода в моей фантастической функции Foo().// Создание делегата MethodInvoker // указывающий на метод Foo() MethodInvoker simpleDelegate = new MethodInvoker(Foo); // Вызываем функцию Foo() асинхронно for(int i=0; i<100; i++) simpleDelegate.BeginInvoke(null, null);Немного прокомментирую этот код:
- Обратите внимание, что BeginInvoke() выполняет функцию Foo(). Однако управление вызывающей стороне передается сразу, без ожидания завершения Foo().
- Этот код не знает, когда завершится Foo(), об этом я расскажу позже.
- BeginInvoke() используется вместо Invoke(). Пока не беспокойтесь о том, какие параметры принимает эта функция. Я расскажу о этом попозже.
среда, 13 мая 2015 г.
C# Cross-thread operations & Invoke((MethodInvoker)delegate () - делегат
MethodInvoker - делегат представляет солобой делегата, который может выполнить любой метод в управляемом коде, объявляемый с пустым списком параметров и не принимающий параметры. Этот делегат можно использовать при вызовах метода Invoke элемента управления или когда требуется простой делегат, но определять его не требуется. В следующем примере кода демонстрируется использование объекта MethodInvoker для вызова метода, обновляющего заголовок окна формы приложений и двух разных форм. Обращение из потока к форме невозможно напрямую , для этого правильнее всего использовать eventы, но если очень хочется и не слишком часто то можно например так
ЯИМЯКОНТРОЛА.Invoke((MethodInvoker)(delegate(){
Тут делать что угодно с ЯИМЯКОНТРОЛА
}));
BeginInvoke(new MethodInvoker(delegate
{
//здесь твой код в основном потоке
}));
ЯИМЯКОНТРОЛА.Invoke((MethodInvoker)(delegate(){
Тут делать что угодно с ЯИМЯКОНТРОЛА
}));
BeginInvoke(new MethodInvoker(delegate
{
//здесь твой код в основном потоке
}));
public partial class Form1 : Form { public Form1() { // Create a timer that will call the ShowTime method every second. var timer = new System.Threading.Timer(ShowTime, null, 0, 1000); } private void ShowTime(object x) { // Don't do anything if the form's handle hasn't been created // or the form has been disposed. if (!this.IsHandleCreated && !this.IsDisposed) return; // Invoke an anonymous method on the thread of the form. this.BeginInvoke((MethodInvoker) delegate { // Show the current time in the form's title bar.
this.Text = DateTime.Now.ToLongTimeString();
textBox1.Text = DateTime.Now.ToLongTimeString();richTextBox1.Text = DateTime.Now.ToLongTimeString();
}); }}Ещё один пример - прием данных с АЦП. Данные приходят из порта после посылкизапроса - отправки байта "0xFF".using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Thread newthread; public Form1() { InitializeComponent(); serialPort1.Open(); } private void func() { int iii = 10; while (true) { Invoke((MethodInvoker)delegate () { var dataArray = new byte[] { 0xFF }; serialPort1.Write(dataArray, 0, 1); Thread.Sleep(50); string res = serialPort1.ReadExisting(); textBox1.Text = ("\n" + "\r" + res); }); } } private void button1_Click(object sender, EventArgs e) { newthread = new Thread(func); newthread.Start(); } private void button2_Click(object sender, EventArgs e) { newthread.Abort(); } private void Close(object sender, FormClosingEventArgs e) { newthread.Abort(); } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { } } }
Task.Factory
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Fraxinus { class Program { static void Main(string[] args) { myClass mc = new myClass(); Task.Factory.StartNew(() => AddData(mc.list1,1)); Task.Factory.StartNew(() => AddData(mc.list2,2)); Task.Factory.StartNew(() => AddData(mc.list3,3)); Console.ReadLine(); } static void AddData(List<int> list,int count) { Console.WriteLine("Task {0} is started now!",count); for (int i = 0; i < 1000; i++) { list.Add(i); Thread.Sleep(10); } Console.WriteLine("Task {0} is completed!",count); } } class myClass { public List<int> list1; public List<int> list2; public List<int> list3; public myClass() { list1 = new List<int>(); list2 = new List<int>(); list3 = new List<int>(); } } }
пятница, 13 марта 2015 г.
C# Thread
Из кода запустить событие, например, нажатия кнопки
при этом должен существовать обработчик события Clik для button1
Если этого не сделать, при попытке поменять что то в форме, добавить, будет выдавать ошибку
button1_Click(null, null);или
button1.PerformClick();
при этом должен существовать обработчик события Clik для button1
private void button1_Click(object sender, EventArgs e) { }Вызов событие нажатия кнопки в одной форме, нажатием в другой
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("!!!"); } private void Form1_Load(object sender, EventArgs e) { Form2 f = new Form2(button1); f.Show(); } } }
namespace WindowsFormsApplication1 { public partial class Form2 : Form { Button b; public Form2(Button b) { this.b = b; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { b.PerformClick(); } } }
Простейший пример создания потока:
//Объявляем класс Thread, загоняем экземпляр в переменную
public Thread newThread;
private void Form1_Load(object sender, EventArgs e)
{
//Создаём новый поток, им будет функция F2
newThread = new Thread(F2);
//Запускаем поток на выполнение
newThread.Start();
}
private void F2() {
int i = 0;
//Запускаем цикл
while(i == 0){
//даём доступ к форме
this.Invoke((MethodInvoker)delegate()
{
//присваиваем значение текстовому полю
textBox1.Text += "1";
//делаем паузу на 50 мсек
Thread.Sleep(50);
});
}
}
private void button1_Click(object sender, EventArgs e)
{
//Останавливаем/удаляем поток
newThread.Abort();
}
данный фрагмент даёт доступ к форме из постороннего потока
private void button1_Click(object sender, EventArgs e)
{
//Останавливаем/удаляем поток
newThread.Abort();
}
Если этого не сделать, при попытке поменять что то в форме, добавить, будет выдавать ошибку
четверг, 19 февраля 2015 г.
C# Serial Port Write/Read text/byte
Classic from MSDN
https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
SerialPort.DataReceived - событие
https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.datareceived(v=vs.110).aspx
SerialPort.DataReceived - событие
public event SerialDataReceivedEventHandler DataReceived
Данные события может быть вызвано элементов в SerialData перечисления. Поскольку необходимость генерации такого события определяется операционной системой, могут выводиться не все ошибки четности.Событие DataReceived также возникает, если получен символ конца файла , независимо от того, числа байтов во внутреннего входном буфере и значения свойства P:System.IO.Ports.SerialPort. ReceivedBytesThreshold.PinChanged, DataReceived, и ErrorReceived события могут вызываться по порядку и может присутствовать небольшая задержка между ними в основном потоке при сообщении об ошибке и при выполнении обработчика событий. Только один обработчик событий может выполняться одновременно.Возникновение DataReceived для каждого байта полученных событий не гарантируется. Необходимо спользовать BytesToRead свойство, чтобы определить, сколько данных оставить для чтения в буфере.Событие DataReceived возникает во вторичном потоке при получении данных от SerialPort объекта .Поскольку это событие вызывается во вторичном потоке, а не главного потока, попытка изменить некоторые элементы в основном потоке, таких как элементы пользовательского интерфейса может вызвать исключение потоковой обработки.using System; using System.IO.Ports; using System.Threading; namespace comportMSDN { class Program { public static SerialPort mySerialPort; public static void Main(string[] args) { mySerialPort.PortName = "COM11"; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); var dataArray = new byte[] { 0xFF }; while (true) { Thread.Sleep(100); mySerialPort.Write(dataArray, 0, 1); } Console.ReadKey(); mySerialPort.Close(); } private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e) { int inp = mySerialPort.BytesToRead; string indata =""; //SerialPort sp = (SerialPort)sender; if (mySerialPort.BytesToRead > 0) { indata = mySerialPort.ReadExisting(); } //Console.WriteLine("Data Received:"); Console.Write(indata); } } }При необходимости изменить элементы в главном Form или Control, запросы на изменение post должны вызываться с помощью Invoke, который будет работать в соответствующем потоке.
// Determine which mode (string or binary) the user is in
if (CurrentDataMode == DataMode.Text)
{
// Read all the data waiting in the buffer
var data = _comport.ReadExisting();
// Check all the data
CheckDeviceSingal(data);
// Write all data in text file
WriteDeviceDataInTextFile(data);
// Display the text to the user in the terminal
Log(LogMsgType.Incoming, data);
}
else
{
// Obtain the number of bytes waiting in the port's buffer
var bytes = _comport.BytesToRead;
// Create a byte array buffer to hold the incoming data
var buffer = new byte[bytes];
// Read the data from the port and store it in our buffer
_comport.Read(buffer, 0, bytes);
// Show the user the incoming data in hex format
Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
}
private string stroka="";
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(DoUpdate));
}
private void DoUpdate(object s,EventArgs e)
{
stroka = stroka + serialPort1.ReadExisting();
}
среда, 4 февраля 2015 г.
Как в C# прервать работу цикла при нажатии клавиши?
Есть цикл, например этот:
while(true)
{
Console.Write("Текст ");
}
Console.Write("Цикл завершился");
Console.ReadKey();
Цикл работает вечно. Нужно что бы он прерывался при нажатии какой то клавиши, например «Q» и продолжалась работа программы. Как это можно сделать?
Serge_Bliznykov:
C# Копировать код // This example demonstrates the Console.KeyAvailable property. using System; using System.Threading; class Sample { public static void Main() { ConsoleKeyInfo cki = new ConsoleKeyInfo(); do { Console.WriteLine("\nPress a key to display; press the 'x' key to quit."); // Your code could perform some useful task in the following loop. However, // for the sake of this example we'll merely pause for a quarter second.while (Console.KeyAvailable == false) Thread.Sleep(250); // Loop until input is entered. cki = Console.ReadKey(true); Console.WriteLine("You pressed the '{0}' key.", cki.Key); } while(cki.Key != ConsoleKey.X); } }
или
ConsoleKeyInfo cki = new ConsoleKeyInfo();while (true) { Console.Write("Текст "); if (Console.KeyAvailable == true) { cki = Console.ReadKey(true); if (cki.Key == ConsoleKey.X) { break; } } } Console.Write("Цикл завершился"); Console.ReadKey();
Подписаться на:
Сообщения (Atom)













